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

时间:2017-05-17 14:07:19

标签: 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></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>

如您所见(让我们忽略<html><body>标签etree添加),节点的顺序已经改变了!用于包装<p>标记的<center>标记现在丢失其内容,并且在</p>标记关闭后添加该内容。是吗?

当我省略<center>标签时,突然解析完成了:

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解析器,因为我在不使用它时会遇到很多解析错误。我也无法更改<p><center>标记的顺序,因为我是这样读的。

1 个答案:

答案 0 :(得分:0)

ngOnInit是块级元素。

<center>不能合法地包含块级元素。

因此,解析器遇到<p>时会关闭<p>

使用有效的HTML - 或XML解析器,它不关心HTML规则(但在交换中不能处理某些HTML细节,如大多数命名实体,如<center>或unclosed / self - 关闭标签)。

现在已经使用CSS对内容进行了中心化处理,因此没有理由再使用&nbsp;(事实上,it's deprecated)。但它仍然有效,如果你坚持使用它,请切换嵌套。

<center>