我正在处理一些Python代码,这些代码使用lxml HTML
解析器来解析一个同事从随机的web站点样本中获取的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个字符的字符串中的位置。如果需要的话,我可以丢弃整个字符串,但我宁愿使用position信息来丢弃"xE2x80"
。出于某种原因,对ele.text执行任何操作都会导致lxml中低级Cython代码出错。我明天上班时可以提供堆栈跟踪。什么,如果我能对那条短信做点什么的话?谢谢。
最佳答案
e2 80
字节本身不会导致错误:
from lxml import html
html_data = b"<p>before “\xe2\x80” after"
p = html.fromstring(html_data)
print(repr(p.text))
# -> u'before \u201c\xe2\x80\u201d after'
正如@Esailija在评论中指出的,上面的数据并没有解释为utf-8。要强制使用utf-8编码:
from lxml import html
html_data = b"""<meta http-equiv="content-type"
content="text/html; charset=UTF-8">
<p>before “\xe2\x80” after"""
doc = html.fromstring(html_data.decode('utf-8','ignore'))
print(repr(doc.find('.//p').text))
# -> u'before \u201c\u201d after'
检查utf-8是否是文档的正确字符编码
在将断开的字节序列传递给lxml之前替换它
关于python - lxml-访问元素的文本时出现UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14333477/