lxml.html对两个相似的输入进行不同的处理?

时间:2018-08-08 09:48:03

标签: python html lxml

使用lxml.html时出现意外输出。

import lxml.html as LH

xmlspec = "<?xml version='1.0' encoding='iso-8859-1'?>"

a = LH.fromstring(xmlspec + "<html><body><p>Body</p></body></html>")
b = LH.fromstring(xmlspec + "<html><meta /><body><p>Body</p></body></html>")

print a # says element p while I would have expected html
print b # says element html which is expected

有人可以解释为什么会这样吗?删除xml规范后,一切正常!有解决这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:2)

经过20多分钟的研究,我得出的结论是:

<?xml version='1.0' encoding='iso-8859-1'?><html><body><p>Body</p></body></html>

不是有效的HTML,而是有效的XML。

从技术上讲

<?xml version='1.0' encoding='iso-8859-1'?><html><meta /><body><p>Body</p></body</html>

也是无效的HTML,但是lxml可以接受。更加可接受的兼容版本是在<head><meta /></head>之后添加<html>,这虽然更好,但仍然不是很好(要成为有效的HTML,它需要在{{ 1}},当然还有其他文档类型。

参考文献:

https://validator.w3.org

https://www.xmlvalidation.com/