python - TypeError: 'str' 不支持 html2text 中的缓冲区接口(interface)

标签 python python-3.x web-scraping typeerror

我正在使用 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/

相关文章:

python - 如何以优雅且安全(关于Python模块重新加载)的方式使用super()?

python - 在Python中按日期从http下载多个XLS文件

python - 在 TensorFlow 中加载导出的模型

mysql - pymysql.err.ProgrammingError : can anyone help me 错误

python - 从 csv 读取并检查 IP 地址可达性

大数据 os.path.getsize 上的 Python 代码性能

node.js - 使用 puppeteer 单击不同链接时遇到问题

python - 如何使用 python+beautifulsoup 抓取标签之外的项目

Python Gekko - 虽然我有一个最佳解决方案,但约束正在被侵犯

python - 在 django3.2 下使用 autocomplete_fields 字段时出现以下问题