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

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

4

2 回答 2

14

您的 HTML 输入已损坏;那个<左尖括号应该被编码为&lt;。从有关解析损坏的 HTML的lxml文档中:

对解析损坏的 HTML 的支持完全取决于 libxml2 的恢复算法。如果您发现文档严重损坏以至于解析器无法处理它们,这不是 lxml 的错。也不能保证生成的树将包含原始文档中的所有数据。解析器在努力继续解析时可能不得不丢弃严重损坏的部分。尤其是放错位置的元标记可能会受到这种影响,这可能会导致编码问题。

换句话说,您可以从此类文档中获得什么,lxml处理损坏的 HTML 的方式是不可配置的。

您可以尝试的一件事是使用不同的HTML 解析器。试试BeautifulSoup,它的 HTML 处理功能可能会为您提供该文档的不同版本,从而为您提供所需的内容。BeautifulSoup 可以重用不同的解析器后端,包括lxmland html5lib,所以它会给你更多的灵活性。

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

>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> &lt; 20 </div></body></html>
于 2013-01-05T11:43:54.880 回答
2

<实际上应该是&lt;,因为<有点像 html 中的“保留字符”。然后它应该工作。

于 2013-01-05T10:54:43.510 回答