Python 类型错误:';str';不支持html2text中的缓冲区接口

Python 类型错误:';str';不支持html2text中的缓冲区接口,python,python-3.x,web-scraping,typeerror,Python,Python 3.x,Web Scraping,Typeerror,我正在使用python3做一些网页抓取。我想保存网页并使用以下代码将其转换为文本: 导入urllib 导入html2text url='1〕http://www.google.com' page=urllib.request.urlopen(url) html_content=page.read() 呈现内容=html2text.html2text(html内容) 但当我运行代码时,它会报告一个类型错误: File”/Library/Frameworks/Python.framework/Ve

我正在使用python3做一些网页抓取。我想保存网页并使用以下代码将其转换为文本:

导入urllib
导入html2text
url='1〕http://www.google.com'
page=urllib.request.urlopen(url)
html_content=page.read()
呈现内容=html2text.html2text(html内容)
但当我运行代码时,它会报告一个类型错误:

File”/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site packages/html2text-2016.4.2-py3.4.egg/html2text/__________.py”,第127行,在提要中
数据=数据。替换(“,”)
TypeError:“str”不支持缓冲区接口

有人能告诉我如何处理这个错误吗?提前谢谢你

urlopen返回的流被b作为带引号的字符串之前的第一个字符指示为ByTestStream。如果您排除它,就像在附加的代码中一样,它似乎可以作为html2txt的输入

import urllib
import html2text
url='http://www.google.com'
with urllib.request.urlopen(url) as page:
    html_content = page.read()
charset_encoding = page.info().get_content_charset()
rendered_content = html2text.html2text(str(html_content)[1:], charset_encoding)

修改使用有关编码的建议。是的,这是一个黑客,但它运行。不使用str()意味着原来的TypeError问题仍然存在。

我花了时间研究了这个问题,结果很容易解决

你为什么会犯这个错误 问题在于输入错误:当调用
page.read()
时,返回的是字节字符串,而不是常规字符串

是Python处理不熟悉字符编码的方式:基本上,原始文本中有一些字符没有映射到Unicode(Python3的默认字符编码)

因为Python不知道使用什么编码,所以Python使用原始字节表示这样的字符串——所有数据在内部都是这样表示的——并让程序员决定使用什么编码

对这些字节字符串调用的常规字符串方法-例如
replace()
,它尝试使用
html2text
-失败,因为字节字符串没有定义这些方法

解决方案 Padraic Cunningham在注释中的解决方案本质上是正确的:您必须首先告诉Python使用哪个字符编码来尝试将这些字节映射到正确的字符集

不幸的是,这个特定的文本不使用Unicode,因此要求它使用
UTF-8
编码进行解码会抛出一个错误

要使用的正确编码实际上包含在请求头本身的
内容类型
头下-这是一个标准头,所有符合HTTP的服务器响应都保证提供

只需调用
page.info().get\u content\u charset()
即可返回此标题的值,在本例中为
iso-8859-1
。从那里,您可以使用
iso-8859-1
对其进行正确解码,以便常规工具可以对其进行正常操作

更通用的解决方案
page.read().encode('utf-8')?感谢您回答我的问题!我试过了,但它显示AttributeError:“bytes”对象没有属性“encode”…对不起,应该解码。这不是解决此问题的正确方法。在删除
b
的情况下使用
str()
,只需将字节字符串包装在字符串包装器中,这是一种黑客行为。它没有解决根本的问题,即字符串中存在Python不知道如何表示的字符。尝试使用此代码的人最终会遇到令人沮丧的编码/解码问题。非常感谢您回答我的问题!现在可以了!非常感谢你!html2text现在可以工作了!但现在我有另一个问题。当我尝试打印呈现的内容时,它会再次报告unicode编码错误。它表示UnicodeEncodeError:“ascii”编解码器无法对345位置的字符“\xbb”进行编码:序号不在范围内(128)。你能告诉我怎么解决这个问题吗?我不知道什么是“渲染内容”。但错误是显而易见的:有些东西试图用原始ASCII编码字符串,而不是“iso-8859-1”。ASCII不适用于这些字符。你最好把这个问题作为一个单独的问题来问,这样就有比我更多的人可以解决它了。
html_content = page.read().decode('iso-8859-1')
charset_encoding = page.info().get_content_charset()
html_content = page.read().decode(charset_encoding)