lxml.html 以不同方式对待两个相似的输入?

lxml.html treats two similar inputs differently?

我在使用 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 规范后一切正常!有没有正确的处理方法?

根据短短 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 允许它。一个更可接受的兼容版本是在 <html> 之后添加 <head><meta /></head> ,这更好但仍然不是很好(要成为有效的 HTML 它需要有一个 <title><head> 里面,当然还有不同的文档类型)。

参考文献:

https://validator.w3.org

https://www.xmlvalidation.com/