无法将 'bytes' 对象隐式转换为 str HTML 解析器 Python3 错误

Can't convert 'bytes' object to str implictly HTML Parser Python3 Error

我正在尝试在 Macbook Air(OS X) 上的 Python 3.4.2 中创建一个 HTML 解析器:

plaintext.py:

from html.parser import HTMLParser
import urllib.request, formatter, sys

website = urllib.request.urlopen("http://www.profmcmillan.com")
data = website.read()
website.close()
format = formatter.AbstractFormatter(formatter.DumbWriter(sys.stdout))
ptext = HTMLParser(format)
ptext.feed(data)
ptext.close()

但我收到以下错误:

Traceback (most recent call last):
  File "/Users/deannarobertazzi/Documents/plaintext.py", line 9, in <module>
    ptext.feed(data)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/html/parser.py", line 164, in feed
    self.rawdata = self.rawdata + data
TypeError: Can't convert 'bytes' object to str implicitly

我查看了 Python 文档,显然您在 Python 3 中解析 HTML 数据的方式与在 Python 2 中解析数据的方式大不相同。我不知道如何修改我的代码以使其适用于 Python 3。谢谢。

2.x 隐式转换仅在所有字节都在 ascii 范围内时才有效。[0-127]

>>> u'a' + 'b'
u'ab'
>>> u'a' + '\xca'

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    u'a' + '\xca'
UnicodeDecodeError: 'ascii' codec can't decode byte 0xca in position 0: ordinal not in range(128)

经常发生的事情,以及为什么它被删除,是代码在使用 ascii 数据测试时可以工作,例如 McMillan 教授的网站今天似乎是这样,但后来失败了,例如如果 McMillan 教授要添加带有 non-ascii 字符的标题,或者如果使用了另一个不是 all-ascii.

的来源

HTMLParser.feed(data) 的文档说数据必须是 'text',在 3.x 中表示 unicode 字符串。所以来自网络的字节必须被解码为 un​​icode。使用 utf-8 解码网站今天有效,因为 ascii 是 utf-8 的子集。但是,该页面目前有

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">

所以如果要添加一个 non-ascii 字符,并且编码没有改变,utf-8 将不起作用。真的没有什么可以替代关注字节的编码。如何发现或猜测网页的编码(假设只使用一种编码)是一个单独的主题。