2

我正在使用BeautifulSoup4做一些网页抓取,并且遇到解码响应问题。网站返回我的标题,在标题中说:使用BeautifulSoup刮取网站时的字符编码问题

content-type:text/html; charset = ISO-8859-1

所以通常我用latin1字符集来解码它。但随后在解码之后,有在HTML中的线,即表示:

<元含量= “text/html的;字符集= UTF-8” HTTP-当量= “内容类型”/ >

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

那么处理这个问题的正常方法是什么?我想在传出的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 

编辑2: 看起来像在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。

+0

你的代码适用于我(在Python 3.2.3和Beautiful Soup 4.1.3的Windows上)。我没有在输出文件中弄乱任何东西。 – Blckknght

+0

不只是使用亚马逊的API的任何理由?哦,欢迎来到SO! – vzwick

+0

默认设置正确的请求标题和编码可以解决这个问题,http://www.datascraping.co/doc/questions/21/encoding-problem-in-website-scraping – Vicky

回答

4

通过Beautiful Soup documentation阅读它看起来像有两种体面的方法。

  1. 最好的解决办法可能是自己不解码HTML文件,只是给原始字节串到美味的汤。它会找出正确的编码,并自动解码文档(使用其包含的Unicode Dammit库)。它会找到并解释相关的HTML元标记,或者分析文档的内容并进行猜测。这当然应该解决你的情况,即使没有meta标签的文档,它也可能在大多数情况下都适用。扫描文档可能会有点慢,所以如果性能是一个重大问题,您可能更喜欢下一个选项。

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

+0

谢谢。这解决了手动检查每个站点进行编码的问题,但仍然没有解决这个问题。自动BS4解码器给我的输出是这样的:http://goo.gl/GbLzf – Ozbolt

+0

你能用你正在使用的代码更新问题吗?我不确定文件如何受到如此严重的损坏。 – Blckknght

+0

你也可以看一下http://scriptcult.com/subcategory_176/article_852-use-beautifulsoup-unicodedammit-with-lxml-html.html以获得正确使用Dammit的感觉 –

0

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

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

>>> import bs4 
>>> bs4.__version__ 

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