>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
有没有人知道任何解决方法?
>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
有没有人知道任何解决方法?
您的 HTML 输入已损坏;那个<
左尖括号应该被编码为<
。从有关解析损坏的 HTML的lxml
文档中:
对解析损坏的 HTML 的支持完全取决于 libxml2 的恢复算法。如果您发现文档严重损坏以至于解析器无法处理它们,这不是 lxml 的错。也不能保证生成的树将包含原始文档中的所有数据。解析器在努力继续解析时可能不得不丢弃严重损坏的部分。尤其是放错位置的元标记可能会受到这种影响,这可能会导致编码问题。
换句话说,您可以从此类文档中获得什么,lxml
处理损坏的 HTML 的方式是不可配置的。
您可以尝试的一件事是使用不同的HTML 解析器。试试BeautifulSoup,它的 HTML 处理功能可能会为您提供该文档的不同版本,从而为您提供所需的内容。BeautifulSoup 可以重用不同的解析器后端,包括lxml
and html5lib
,所以它会给你更多的灵活性。
html5lib
解析器确实为您提供了字符<
(转换为<
转义):
>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> < 20 </div></body></html>
您<
实际上应该是<
,因为<
有点像 html 中的“保留字符”。然后它应该工作。