无法将'bytes'对象转换为str implictly HTML Parser Python3 Error

时间:2015-01-19 19:19:32

标签: python python-3.x html-parsing python-3.4 html-parser

我试图在Macbook Air(OS X)上用Python 3.4.2创建一个HTML Parser:

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谢谢你。

1 个答案:

答案 0 :(得分:2)

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教授是使用非ascii char添加标题,或者使用不是all-ascii的其他源。

HTMLParser.feed(data)的文档说数据必须是&#39; text&#39;,其中3.x表示unicode字符串。因此,必须将来自Web的字节解码为unicode。使用utf-8解码网站今天有效,因为ascii是utf-8的子集。但是,该页面目前有

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

因此,如果要添加非ascii char,并且编码未更改,则utf-8将无效。注意字节编码确实无可替代。如何发现或猜测网页的编码(假设只使用了一种编码)是一个单独的主题。