我想比较一些基于其整体DOM结构的网页,而不是它们的特定内容。为此,我需要一个类似于标签层次的表示,但不包括属性或文本标签内容。
基本上,我想转换像这样的表示
<!DOCTYPE html>
<html>
<body>
<h1 id="peter">My First Heading</h1>
<p><span style="color:red">My</span> first paragraph.</p>
<img src="peter.jpg" />
</body>
</html>
成为这样的标准裸金属表示:
<html><body><h1></h1><p><span></span></p><img/></body></html>
即。删除了所有属性,以及不是其他标记的标记内容。
我找到了一种从标签中删除属性的方法,但我在文本子节点和标记子节点之间存在差异。
答案 0 :(得分:2)
正如docs所说,
您无法在适当的位置编辑字符串,但可以使用replace_with()
将一个字符串替换为另一个字符串
所以我会选择这样的事情(假设soup
正是你所发布的):
for e in soup.find_all(True):
e.attrs = {}
for i in e.contents:
if i.string:
i.string.replace_with('')
我认为如果没有循环到每个标记的内容,在标记包含多个子项并且其中一个是文本而另一个是另一个包含文本的标记的情况下,您最终会得到一些文本剩余部分(如示例所示) <p><span style="color:red">My</span> first paragraph.</p>
)。
针对您的示例运行时:
(env) $ python strip.py
<!DOCTYPE html>
<html><body><h1></h1><p><span></span></p><img/></body></html>
(它可以稍微更改,因此不会返回换行符或doctype)