Python lxml etree HTML解析器更改节点顺序

Python lxml etree HTML解析器更改节点顺序,python,lxml,elementtree,Python,Lxml,Elementtree,我目前面临一个无法解释etree行为的问题。下面的代码演示了我所面临的问题。我想解析一个HTML字符串,如下图所示,更改元素的属性,完成后重新打印HTML from lxml import etree from io import StringIO, BytesIO string = "<p><center><code>git clone https://github.com/AlexeyAB/darknet.git</code></cen

我目前面临一个无法解释etree行为的问题。下面的代码演示了我所面临的问题。我想解析一个HTML字符串,如下图所示,更改元素的属性,完成后重新打印HTML

from lxml import etree
from io import StringIO, BytesIO

string = "<p><center><code>git clone https://github.com/AlexeyAB/darknet.git</code></center></p>"
parser = etree.HTMLParser()
test = etree.fromstring(string, parser)
print(etree.tostring(test, pretty_print=True, method="html")
我得到这个输出:

<html><body>
<p></p>
<center><code>git clone https://github.com/AlexeyAB/darknet.git</code></center>
</body></html>
如您所见(让我们忽略etree添加的
标记),节点的顺序已更改!用于包装
标记的
标记现在将丢失其内容,而该内容将在
标记关闭后添加。嗯?

当我省略
标记时,突然间解析正确完成:

from lxml import etree
from io import StringIO, BytesIO

string = "<p><code>git clone https://github.com/AlexeyAB/darknet.git</code></p>"
parser = etree.HTMLParser()
test = etree.fromstring(string, parser)
print(etree.tostring(test, pretty_print=True, method="html"))
输出正确:

<html><body><p><code>git clone https://github.com/AlexeyAB/darknet.git</code></p></body></html>
我做错什么了吗?我必须使用HTML解析器,因为在不使用它的情况下会出现很多解析错误。我也无法更改
标记的顺序,因为我以这种方式读取它们。

是块级元素

不能合法地包含块级元素

因此,解析器在遇到
时关闭

使用有效的HTML或XML解析器,它不关心HTML规则(但在exchange中无法处理某些HTML细节,如大多数命名实体,如
或未关闭/自动关闭标记)

内容中心化已经用CSS做了很久了,现在没有理由再使用
(事实上,)。但它仍然有效,如果您坚持使用它,请切换嵌套

<center><p><code>git clone https://github.com/AlexeyAB/darknet.git</code></p></center>
是块级元素

不能合法地包含块级元素

因此,解析器在遇到
时关闭

使用有效的HTML或XML解析器,它不关心HTML规则(但在exchange中无法处理某些HTML细节,如大多数命名实体,如
或未关闭/自动关闭标记)

内容中心化已经用CSS做了很久了,现在没有理由再使用
(事实上,)。但它仍然有效,如果您坚持使用它,请切换嵌套

<center><p><code>git clone https://github.com/AlexeyAB/darknet.git</code></p></center>

解析器
从何而来?如果使用
而不是
,也会发生同样的情况。也许这是lxml的一些微妙提示,您不应该在
中使用
相当于
)。请参阅。@panatale1,我编辑了代码以包含
解析器的定义,它在复制代码时丢失了(高出几行),虽然我think@mzjn,谢谢你澄清。因此,看起来lxml试图在这里做一件好事,纠正一个本来不应该发生的情况:
解析器
来自哪里?如果使用
而不是
,也会发生同样的情况。也许这是lxml的一些微妙提示,您不应该在
中使用
相当于
)。请参阅。@panatale1,我编辑了代码以包含
解析器的定义,它在复制代码时丢失了(高出几行),虽然我think@mzjn,谢谢你澄清。所以看起来lxml正在尝试做一件好事,纠正一个本来不应该发生的情况?我认为块级。。。?至少这可以解释解析器的行为。我认为问题在于使用
(或
)作为
的子元素。噢,
是块级元素。当然谢谢你的更正。:)我以为是街区级别。。。?至少这可以解释解析器的行为。我认为问题在于使用
(或
)作为
的子元素。噢,
是块级元素。当然谢谢你的更正。:)