Python 和 BeautifulSoup 编码问题

标签 python unicode utf-8 beautifulsoup

我正在使用 BeautifulSoup 用 Python 编写一个爬虫,一切都很顺利,直到我遇到了这个网站:

http://www.elnorte.ec/

我正在使用请求库获取内容:

r = requests.get('http://www.elnorte.ec/')
content = r.content

如果我此时打印内容变量,所有西类牙语特殊字符似乎都可以正常工作。但是,一旦我尝试将内容变量提供给 BeautifulSoup,一切都会变得一团糟:

soup = BeautifulSoup(content)
print(soup)
...
<a class="blogCalendarToday" href="/component/blog_calendar/?year=2011&amp;month=08&amp;day=27&amp;modid=203" title="1009 artículos en este día">
...

它显然把所有的西类牙特殊字符(口音之类的)都弄乱了。我试过做 content.decode('utf-8'), content.decode('latin-1'),还尝试将 fromEncoding 参数设置为 BeautifulSoup,将其设置为 fromEncoding='utf-8' 和 fromEncoding ='latin-1',但还是没有骰子。

任何指针将不胜感激。

最佳答案

在您的情况下,此页面包含错误的 utf-8 数据,这会混淆 BeautifulSoup 并使其认为您的页面使用 windows-1252,您可以这样做:

soup = BeautifulSoup.BeautifulSoup(content.decode('utf-8','ignore'))

通过这样做,您将从页面源中丢弃任何错误的符号,BeautifulSoup 将正确猜测编码。

您可以将 'ignore' 替换为 'replace' 并检查文本中的 '?'符号以查看已丢弃的内容。

实际上,编写爬虫是一项非常艰巨的任务,它每次都能以 100% 的机会猜测页面编码(现在的浏览器非常擅长),你可以使用像 'chardet' 这样的模块,但是,例如,在你的情况下会猜测编码为 ISO-8859-2,这也不正确。

如果您真的需要能够为用户可能提供的任何页面获取编码 - 您应该构建一个多级(尝试 utf-8、尝试 latin1、尝试等...)检测功能(就像我们所做的那样在我们的项目中)或使用一些来自 firefox 或 chromium 的检测代码作为 C 模块。

关于Python 和 BeautifulSoup 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219361/

相关文章:

Python subprocess.Popen - 添加 GCcflags导致 "no input files"错误

python - 将 html 实体文件转换为 Unicode(使用 BeautifulSoup 和 Python?)

javascript - 如何使用 Unicode Hexadecimal 更改 css 样式

c# - .net 中的转换 : Native Utf-8 <-> Managed String

Python 读取带有希伯来文标题的 csv

python - 如何关闭 Selenium 中的打印对话框?

python - numpy.digitize 返回超出范围的值?

r - 在 knitr R-figure 片段中获取 Unicode 字符

Java字符编码写入文本文件

python - 如何告诉 pytest-dependency 暂时忽略测试依赖项?