我正在使用 BeautifulSoup 用 Python 编写一个爬虫,一切都很顺利,直到我遇到了这个网站:
我正在使用请求库获取内容:
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&month=08&day=27&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/