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

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

我正在使用 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看起来有两种不错的方法。

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

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

关于python - 使用 BeautifulSoup 抓取网站时出现字符编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546908/

相关文章:

python - 试图在 python 列表上做一个浅拷贝

php - 使用捷克字符集查询不起作用?

javascript - TOMCAT报告此错误: INFO: Character decoding failed

python - python 上的 MySQL 查询中的转义引号

python - 如何对值列表进行 api 请求调用?

python - 向 MultiIndex DataFrame 添加一个空行

python - 放大和缩小文本小部件 tkinter

python - PyQt5选择可用的最新OpenGL版本

powershell - 将Powershell脚本粘贴到Powershell中时运行,但从快捷方式运行时不运行

python - 如何使用 SQLAlchemy 只创建一张表?