lxml截断包含“小于”字符的文本

时间:2013-01-05 10:52:34

标签: python html-parsing lxml

>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'

有人知道任何解决方法吗?

2 个答案:

答案 0 :(得分:13)

您的HTML输入已损坏; <左尖括号应该已编码为&lt;。从lxml documentation解析破碎的HTML:

  

解析破坏的HTML的支持完全取决于libxml2的恢复算法。如果您发现文档严重破坏而解析器无法处理它们,则不是lxml的错误。也不能保证结果树将包含原始文档中的所有数据。在努力保持解析时,解析器可能不得不丢弃严重损坏的部分。特别错放的元标记可能会受此影响,这可能会导致编码问题。

换句话说,您可以从这些文档中获取所需的内容,lxml处理损坏的HTML的方式是不可配置的。

可以尝试的一件事是使用不同的 HTML解析器。请尝试使用BeautifulSoup,它的破坏HTML处理可能会为您提供该文档的不同版本,它可以为您提供所需的文档。 BeautifulSoup可以重复使用不同的解析器后端,包括lxmlhtml5lib,因此它会为您提供更大的灵活性。

html5lib解析器会为您提供<字符(转换为&lt;转义符):

>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> &lt; 20 </div></body></html>

答案 1 :(得分:2)

<实际上应该是&lt;,因为<有点像保留字符&#39;在HTML中。然后它应该工作。