我正在尝试加载一个 html 页面并输出文本,即使我正确获取网页,BeautifulSoup 以某种方式破坏了编码。
来源:
# -*- coding: utf-8 -*-
import requests
from BeautifulSoup import BeautifulSoup
url = "http://www.columbia.edu/~fdc/utf8/"
r = requests.get(url)
encodedText = r.text.encode("utf-8")
soup = BeautifulSoup(encodedText)
text = str(soup.findAll(text=True))
print text.decode("utf-8")
摘录输出:
...Odenw\xc3\xa4lderisch...
这应该是 Odenwälderisch
原文由 user1767754 发布,翻译遵循 CC BY-SA 4.0 许可协议
你犯了两个错误;您错误地处理了编码,并且将结果列表视为可以安全地转换为字符串而不会丢失信息的东西。
首先,不要使用
response.text
!这不是 BeautifulSoup 的错,您正在重新编码 Mojibake 。当服务器未明确指定编码时,requests
库将默认为text/*
内容类型的 Latin-1 编码,因为 HTTP 标准规定这是默认值。请参阅 高级 文档的 编码 部分:
大胆强调我的。
改为
response.content
原始数据:我看到您正在使用 BeautifulSoup 3。您真的想升级到 BeautifulSoup 4;版本 3 已于 2012 年停产,并且包含多个错误。安装
beautifulsoup4
项目,并使用from bs4 import BeautifulSoup
。BeautifulSoup 4 通常可以很好地确定解析时使用的正确编码,无论是从 HTML
<meta>
标记还是对提供的字节进行统计分析。如果服务器确实提供了一个字符集,您仍然可以将其从响应中传递到 BeautifulSoup,但请先测试requests
是否使用了默认值:最后但同样重要的是,使用 BeautifulSoup 4,您可以使用
soup.get_text()
从页面中提取所有文本:您而是将 _结果列表_(
soup.findAll()
的返回值)转换为字符串。这永远行不通,因为 Python 中的容器在列表中的每个元素上使用repr()
来生成 _调试字符串_,对于字符串,这意味着您将获得任何非可打印 ASCII 字符的转义序列。