【问题标题】:lxml - UnicodeDecodeError when accessing text of an elementlxml - 访问元素文本时出现 UnicodeDecodeError
【发布时间】:2012-12-29 07:12:21
【问题描述】:

我正在使用一些 Python 代码,这些代码使用 lxml HTML 解析器来解析同事从随机网站样本中抓取的 HTML。

在其中两个中,我收到了表单错误

"'utf8' 编解码器无法解码位置 502 中的字节 0xe20x80:意外 数据结束",

并且 HTML 内容确实包含损坏的 UTF-8 字符。

代码中名为 ele 的变量被分配给包含错误字符的文本周围的

元素,并且可以通过 ele.text 访问该文本。或者它可能是,但仅仅将 ele.text 分配给另一个变量会导致 UnicodeDecodeError 被提升。在 except 子句中可用的 UnicodeDecodeError 类型的对象包含一些有用的属性,例如文本中坏字节的开始和结束位置,可用于创建已删除坏字节的新字符串,但是对 ele.text 做任何事情,例如获取它的子字符串,都会导致新的UnicodeDetectError 被提升。我能做些什么来挽救ele.text 的优点吗?

我是凭记忆写的,我不记得代码的所有细节,所以如果有用的话我明天再提供更多信息。我记得的是 ele 是一个类似lxml._Element 类型的对象,被解析的文件确实在utf-8 中,并且文件中有一个位置,其中前两个utf-8 字节的字符匹配实体“紧随其后的是实体“。所以文本包含"xE2x80”"。错误消息抱怨"xE2x80" 并在其中包含大约 520 个字符的字符串中给出了它们的位置。如有必要,我可以丢弃整个字符串,但我宁愿只使用位置信息来丢弃"xE2x80"。出于某种原因,使用 ele.text 执行任何操作都会导致 lxml 中较低级别的 Cython 代码出错。我明天上班时可以提供堆栈跟踪。什么,如果我能用那个文本做什么?谢谢。

【问题讨论】:

    标签: python html unicode utf-8 lxml


    【解决方案1】:

    e2 80 字节本身不会导致错误:

    from lxml import html
    
    html_data = b"<p>before &ldquo;\xe2\x80&rdquo; after"
    p = html.fromstring(html_data)
    print(repr(p.text))
    # -> u'before \u201c\xe2\x80\u201d after'
    

    正如@Esailija 在 cmets 中指出的那样,上述数据并未将数据解释为 utf-8。强制 utf-8 编码:

    from lxml import html
    
    html_data = b"""<meta http-equiv="content-type"
                          content="text/html; charset=UTF-8">
                    <p>before &ldquo;\xe2\x80&rdquo; after"""
    doc = html.fromstring(html_data.decode('utf-8','ignore'))
    print(repr(doc.find('.//p').text))
    # -> u'before \u201c\u201d after'
    
    • 检查 utf-8 是否是文档的正确字符编码
    • 在将损坏的字节序列传递给 lxml 之前替换它

    【讨论】:

    • 是的,e2 是 3 字节长 UTF-8 序列的前导字节。你可以写"\xe2\x80".decode("utf-8")
    • @Esailija:如果你运行答案中的代码,你会得到什么?
    • 您的答案中根本没有解码尝试(如 utf-8)
    • @Esailija:试试type(p.text)。你看到了什么?
    • 我看到"\xe2\x80".decode("iso-8859-1")生效的结果
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2012-07-25
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多