【问题标题】:lxml.html treats two similar inputs differently?lxml.html 以不同的方式处理两个相似的输入?
【发布时间】:2019-01-15 12:51:21
【问题描述】:

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

【问题讨论】:

  • 我想你发现了你的错误。最初你在&lt;html&gt;之外有&lt;meta /&gt;
  • @JavierBuzzi,很好的观察。我纠正了这一点。我仍然遇到同样的错误。
  • 哼。是的,你是对的,仍在谷歌搜索,但如果你将导入从 html / 交换到 etree 并且不更改任何其他内容:它可以工作。但我就像一条有骨头的狗,我喜欢你,想了解为什么。

标签: python html lxml


【解决方案1】:

通过 20 多分钟的研究,我得出了这样的结论:

&lt;?xml version='1.0' encoding='iso-8859-1'?&gt;&lt;html&gt;&lt;body&gt;&lt;p&gt;Body&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;

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

从技术上讲,

&lt;?xml version='1.0' encoding='iso-8859-1'?&gt;&lt;html&gt;&lt;meta /&gt;&lt;body&gt;&lt;p&gt;Body&lt;/p&gt;&lt;/body&lt;/html&gt;

也不是有效的 HTML,但 lxml 可以原谅它。更可接受的兼容版本是在&lt;html&gt; 之后添加&lt;head&gt;&lt;meta /&gt;&lt;/head&gt;,这更好但仍然不是很好(要成为有效的HTML,它需要在&lt;head&gt; 内有一个&lt;title&gt;,当然,一个不同的文档类型)。

参考资料:

https://validator.w3.org

https://www.xmlvalidation.com/

【讨论】:

  • 谢谢,伙计。我会看看如何处理这个!
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2020-12-17
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多