使用BeautifulSoup抓取网站时出现字符编码问题

时间:2012-09-22 19:13:14

标签: python character-encoding python-3.x web-scraping beautifulsoup

我正在使用BeautifulSoup4做一些网页报废,并且遇到解码响应问题。网站返回标题,标题中显示:

  

content-type:text / html;字符集= ISO-8859-1

通常我用latin1字符集解码它。但是在解码之后,html中有一行说:

  

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

现在从字符串上的这一行未正确解码。

那么处理这个问题的正常方法是什么?我想在传出的http标头中设置accept-encoding行,但找不到办法。其他选择是逐行解码搜索新的字符集,但更喜欢只通过接受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。

2 个答案:

答案 0 :(得分:4)

通过Beautiful Soup documentation阅读,看起来有两种不错的方法。

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

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

答案 1 :(得分:0)

这可能是BeautifulSoup not reading documents correctly的副本,即由BS 4.0.2中的bug引起。

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

的输出
>>> import bs4
>>> bs4.__version__

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

相关问题