【问题标题】:Can't convert 'bytes' object to str implictly HTML Parser Python3 Error无法将“字节”对象隐式转换为 str HTML Parser Python3 错误
【发布时间】:2015-03-17 21:26:07
【问题描述】:

我正在尝试在 Macbook Air(OS X) 上使用 Python 3.4.2 创建 HTML 解析器:

明文.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。谢谢你。

【问题讨论】:

  • data 字节串使用什么编码?例如,如果latin-1ptext.feed(data.decode('latin-1')) 就可以工作。它与 Python 2 没有太大区别,您现在必须仔细区分文本(Unicode 字符的字符串)和字节字符串(任意字节的字符串,通常通过各种可能的编解码器对文本进行编码)......这一直是个好主意但现在是强制性的:-)。
  • 我将 UTF-8 包含在 ptext.feed(data.decode('UTF-8)) 行中,它起作用了。

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


【解决方案1】:

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 字符,或者如果使用了其他非全 ascii 的来源。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2014-08-03
    • 2016-04-15
    • 2015-01-18
    • 1970-01-01
    • 2017-07-21
    • 2017-12-21
    • 2019-04-11
    相关资源
    最近更新 更多