我试图在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谢谢你。
答案 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
将无效。注意字节编码确实无可替代。如何发现或猜测网页的编码(假设只使用了一种编码)是一个单独的主题。