Python lxml是否会更改标签层次结构?

时间:2011-08-24 19:07:59

标签: python html xml lxml

我对lxml有一个小问题。我正在将XML文档转换为HTML文档。 原始XML看起来像这样(它看起来像HTML,但它在XML文档中):

<p>Localization - Eiffel tower? Paris or Vegas <p>Bayes theorem p(A|B)</p></p>

当我这样做时(项目是上面的字符串)

lxml.html.tostring(lxml.html.fromstring(item))

我明白了:

<div><p>Localization - Eiffel tower? Paris or Vegas </p><p>Bayes theorem p(A|B)</p></div>

我对&lt; div&gt; s没有任何问题,但是'贝叶斯定理'段落不再嵌套在外段中是一个问题。

任何人都知道为什么lxml会这样做以及如何阻止它?感谢。

2 个答案:

答案 0 :(得分:12)

lxml这样做是因为它不会在HTML中存储无效的HTML和<p>元素can't be nested

  

P元素代表一个段落。它不能包含块级元素(包括P本身)。

答案 1 :(得分:1)

您使用的是lxml的HTML解析器,而不是XML解析器。试试这个:

>>> from lxml import etree
>>> item = '<p>Eiffel tower? Paris or Vegas <p>Bayes theorem p(A|B)</p></p>'
>>> root = etree.fromstring(item)
>>> etree.tostring(root, pretty_print=True)
'<p>Eiffel tower? Paris or Vegas <p>Bayes theorem p(A|B)</p></p>\n'