我正在使用 python3 进行一些网页抓取。我想保存网页并使用以下代码将其转换为文本:
import urllib
import html2text
url='http://www.google.com'
page = urllib.request.urlopen(url)
html_content = page.read()
rendered_content = html2text.html2text(html_content)
但是当我运行代码时,它报告类型错误:
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/html2text-2016.4.2-py3.4.egg/html2text/__init__.py", line 127, in feed
data = data.replace("</' + 'script>", "</ignore>")
TypeError: 'str' does not support the buffer interface
谁能告诉我如何处理这个错误?预先感谢您!
最佳答案
我花了时间调查这个问题,结果很容易解决。
为什么出现此错误
问题是错误输入之一:当您调用 page.read()
时,返回一个字节字符串,而不是常规字符串。
Byte strings是 Python 处理不熟悉的字符编码的方式:基本上,原始文本中的某些字符未映射到 Unicode(Python 3 的默认字符编码)。
因为 Python 不知道要使用什么编码,所以 Python 使用原始字节来表示此类字符串 - 这就是所有数据在内部表示的方式 - 并让程序员决定使用什么编码。
对这些字节字符串调用的常规字符串方法(例如 html2text
尝试使用的 replace()
)会失败,因为字节字符串没有定义这些方法。
解决方案
html_content = page.read().decode('iso-8859-1')
Padraic Cunningham 在评论中的解决方案本质上是正确的:你必须首先告诉 Python 使用哪种字符编码来尝试将这些字节映射到正确的字符集。
不幸的是,这个特定文本不使用 Unicode,因此要求它使用 UTF-8
编码进行解码会引发错误。
要使用的正确编码实际上包含在Content-Type
header 下的请求 header 本身中 - 这是所有符合HTTP标准的服务器响应的标准 header 保证提供。
只需调用 page.info().get_content_charset()
即可返回此 header 的值,在本例中为 iso-8859-1
。从那里,您可以使用 iso-8859-1
正确解码它,以便常规工具可以正常操作它。
更通用的解决方案
charset_encoding = page.info().get_content_charset()
html_content = page.read().decode(charset_encoding)
关于python - TypeError: 'str' 不支持 html2text 中的缓冲区接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36877016/