2

我正在使用 BeautifulSoup4 进行一些网络抓取,并且在解码响应方面遇到问题。网站返回我的标题,标题中说:

内容类型:文本/html;字符集=ISO-8859-1

所以通常我用 latin1 字符集对其进行解码。但是解码后,html中有一行,上面写着:

<meta content="text/html; charset=utf-8" http-equiv="content-type" />

现在从这行开始,字符串没有正确解码。

那么处理这个问题的正常方法是什么?我想在传出的 http 标头中设置接受编码行,但找不到方法。其他选项是逐行解码以搜索新字符集,但更愿意仅通过接受 utf-8 来完成

我使用 Python3,libray http.client

EDIT1:代码:

import http.client as cl
from bs4 import BeautifulSoup

conn = cl.HTTPConnection('www.amazon.com')
conn.request("GET", '/A-Man-For-All-Seasons/dp/B003TQ1IW6/ref=sr_1_109?s=instant-video&ie=UTF8&qid=1348337540&sr=1-109')
response = conn.getresponse()
content = response.read()

soup = BeautifulSoup(content)
f = open('am.html', 'w')
f.write(soup.prettify())

#i am actually doing this with httplib2 but result is the same

EDIT2:看起来 Linux 中 Beautiful Soup 4 的配置确实有问题,或者它是一个错误。这是有效的,但我无法用 BS4 解析响应:

import httplib2
h = httplib2.Http('.cache')
response, content = h.request(movieLink , headers={'accept-charset': 'latin1'})
content = content.decode('latin-1')

谢谢你,Blckknght。

4

2 回答 2

4

通读Beautiful Soup 文档,看起来有两种不错的方法。

  1. 最好的解决方案可能是不自己解码 HTML 文档,而只是将原始字节字符串提供给 Beautiful Soup。它将找出正确的编码,并自动解码文档(使用其包含的Unicode Dammit库)。它会查找并解释相关的 HTML 元标记(如果有),或者分析文档的内容并进行猜测。这肯定会解决您的直接情况,即使对于没有元标记的文档,它也可能在大多数情况下都能正确处理。不过,扫描文档可能有点慢,所以如果性能是一个重要问题,您可能更喜欢下一个选项。

  2. 下一个最佳解决方案可能是将您自己的知识应用于该问题。如果您要抓取的页面始终编码为 UTF-8,则无论服务器说什么,您都可以简单地使用它。这当然取决于页面编码是否一致,这可能是也可能不是这种情况(例如,具有一些 UTF-8 页面和一些 Latin-1 页面的网站)。如果您只抓取单个页面(或单一类型的页面,在动态站点上),您可能总是会找到相同的编码,所以这可以很好地工作。这种方法的优点是它的简单性(在较小程度上是速度),但它是以灵活性和健壮性为代价的。如果站点更改其使用的编码,您的脚本可能会中断。

于 2012-09-22T22:41:53.173 回答
0

这可能是BeautifulSoup 没有正确读取文档的副本,即是由BS 4.0.2 中的错误引起的。

该错误已在 4.0.3 中修复。您可能想检查的输出

>>> import bs4
>>> bs4.__version__

如果是 4.0.2,请将 BeautifulSoup 升级到更高版本。

于 2013-08-27T11:35:06.000 回答