我目前正面临一个无法解释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>
标记的顺序,因为我是这样读的。
答案 0 :(得分:0)
ngOnInit
是块级元素。
<center>
不能合法地包含块级元素。
因此,解析器遇到<p>
时会关闭<p>
。
使用有效的HTML - 或XML解析器,它不关心HTML规则(但在交换中不能处理某些HTML细节,如大多数命名实体,如<center>
或unclosed / self - 关闭标签)。
现在已经使用CSS对内容进行了中心化处理,因此没有理由再使用
(事实上,it's deprecated)。但它仍然有效,如果你坚持使用它,请切换嵌套。
<center>