>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
有人知道任何解决方法吗?
答案 0 :(得分:13)
您的HTML输入已损坏; <
左尖括号应该已编码为<
。从lxml
documentation解析破碎的HTML:
解析破坏的HTML的支持完全取决于libxml2的恢复算法。如果您发现文档严重破坏而解析器无法处理它们,则不是lxml的错误。也不能保证结果树将包含原始文档中的所有数据。在努力保持解析时,解析器可能不得不丢弃严重损坏的部分。特别错放的元标记可能会受此影响,这可能会导致编码问题。
换句话说,您可以从这些文档中获取所需的内容,lxml
处理损坏的HTML的方式是不可配置的。
您可以尝试的一件事是使用不同的 HTML解析器。请尝试使用BeautifulSoup,它的破坏HTML处理可能会为您提供该文档的不同版本,它可以为您提供所需的文档。 BeautifulSoup可以重复使用不同的解析器后端,包括lxml
和html5lib
,因此它会为您提供更大的灵活性。
html5lib
解析器会为您提供<
字符(转换为<
转义符):
>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> < 20 </div></body></html>
答案 1 :(得分:2)
<
实际上应该是<
,因为<
有点像保留字符&#39;在HTML中。然后它应该工作。