如何在Python中修改HTML树?

4
假设有一些变量片段的html代码。
<p>
    <span class="code"> string 1 </ span>
    <span class="code"> string 2 </ span>
    <span class="code"> string 3 </ span>
</ p>
<p>
    <span class="any"> Some text </ span>
</ p>

我需要修改所有带有代码类<span>的标签内容,通过使用foo这样的函数跳过某些内容,该函数返回已修改标签<span>的内容。最终,我应该得到一个如下的新的HTML文档:
<p>
    <span class="code"> modify string 1 </ span>
    <span class="code"> modify string 2 </ span>
    <span class="code"> modify string 3 </ span>
</ p>
<p>
    <span class="any"> Some text </ span>
</ p>

有人建议我可以使用Python库BeautifulSoup4轻松查找特定的HTML节点。如何修改内容中的<span class="code">并将新版本保存为新文件?我猜想需要使用soup.find_all('span',class=re.compile("code"))来查找,只有这个函数返回一个示例对象的列表副本,对其进行修改不会改变soup的内容。我该如何解决这个问题?

1个回答

4

</ span> 是无效的HTML,即使是网络浏览器的宽容解析器也不能正确解析它。

一旦您修复了HTML,就可以使用.replaceWith()

from bs4 import BeautifulSoup

soup = BeautifulSoup('''
    <p>
        <span class="code"> string 1 </span>
        <span class="code"> string 2 </span>
        <span class="code"> string 3 </span>
    </p>
    <p>
        <span class="any"> Some text </span>
    </p>
''', 'html5lib')

for span in soup.find_all('span', class_='code'):
    span.string.replaceWith('modified ' + span.string)

1
嗯,使用 BeautifoulSoup4 进行了检查,它确实可以正确解析 </span>!但是它会弄乱 <span> - shad0w_wa1k3r
@AshishNitinPatil:<span>标签会嵌套在彼此之内。 - Blender
哦,没注意到。谢谢! - shad0w_wa1k3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接