我正在使用 BeautifulSoup4 进行一些网页抓取,但在解码响应方面遇到问题。网站返回我 header , header 中显示:
content-type: text/html; charset=ISO-8859-1
所以通常我用 latin1 字符集解码它。但是解码后,html中有一行内容:
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
现在从这一行开始,字符串无法正确解码。
那么处理这个问题的正常方法是什么?我想设置accept-encoding行在传出的http header 中,但找不到方法来做到这一点。其他选项是逐行解码搜索新的字符集,但更喜欢仅接受 utf-8
我使用Python3,libray http.client
编辑1: 代码:
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
编辑2: 看起来 Linux 中 Beautiful Soup 4 的配置确实有问题或者是一个 bug。 这是可行的,但我无法用 BS4 解析响应:
import httplib2
h = httplib2.Http('.cache')
response, content = h.request(movieLink , headers={'accept-charset': 'latin1'})
content = content.decode('latin-1')
谢谢你,Blckknght。
最佳答案
通读 Beautiful Soup documentation看起来有两种不错的方法。
最好的解决方案可能是不自己解码 HTML 文档,而只是将原始字节字符串提供给 Beautiful Soup。它将找出正确的编码,并自动解码文档(使用其包含的
Unicode Dammit
库)。它将查找并解释相关的 HTML 元标记(如果有),或者分析文档的内容并进行猜测。这肯定可以解决您当前的情况,即使对于没有元标记的文档,它也可能在大多数情况下正确。不过,扫描文档可能会有点慢,因此如果性能是一个重要问题,您可能更喜欢下一个选项。下一个最佳解决方案可能是将您自己的知识应用于该问题。如果您正在抓取的页面始终编码为 UTF-8,则无论服务器说什么,您都可以简单地始终使用它。这当然取决于页面编码是否一致,情况可能如此,也可能不是(例如,具有一些 UTF-8 页面和一些 Latin-1 页面的网站)。如果您只抓取单个页面(或动态网站上的单一类型页面),您可能会始终找到相同的编码,因此这可以很好地工作。这种方法的优点是简单(在较小程度上是速度),但它是以灵活性和稳健性为代价的。如果网站更改其使用的编码,您的脚本可能会损坏。
关于python - 使用 BeautifulSoup 抓取网站时出现字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546908/