如何在与BeautifulSoup的链接后附加标记

sys*_*out 5 python beautifulsoup

从这样的Html输入开始:

<p>
<a href="http://www.foo.com">this if foo</a>
<a href="http://www.bar.com">this if bar</a>
</p>
Run Code Online (Sandbox Code Playgroud)

使用BeautifulSoup,我想改变这个Html:

<p>
<a href="http://www.foo.com">this if foo</a><b>OK</b>
<a href="http://www.bar.com">this if bar</a><b>OK</b>
</p>
Run Code Online (Sandbox Code Playgroud)

是否可以使用BeautifulSoup来做到这一点?

就像是:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
for link_tag in soup.findAll('a'):
    link_tag = link_tag + '<b>OK</b>' #This obviously does not work
Run Code Online (Sandbox Code Playgroud)

tca*_*uce 8

您可以使用BeautifulSoup的插入在正确的位置添加元素:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)

for link_tag in soup.findAll('a'):
    link_tag_idx = link_tag.parent.contents.index(link_tag)
    link_tag.parent.insert(link_tag_idx + 1, '<b>OK</b>')
Run Code Online (Sandbox Code Playgroud)

这适用于您提供的示例,但我不确定它是唯一或最有效的方法.


Jon*_*n W 5

你有正确的想法.只是匹配类型,并做replaceWith.

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
for link_tag in soup.findAll('a'):
    link_tag.replaceWith( link_tag.prettify() + '<b>OK</b>' )
print soup
Run Code Online (Sandbox Code Playgroud)

应该给你:

<p>
 <a href="http://www.foo.com">
this if foo
</a>
<b>OK</b>
 <a href="http://www.bar.com">
this if bar
</a>
<b>OK</b>
</p>
Run Code Online (Sandbox Code Playgroud)

  • 对于任何从Google等获得此答案的人来说,在BS4中有一个insert_after()方法,例如:`b = soup.new_tag("b"); b.string ="OK"; link_tag.insert_after(b)`应该工作. (9认同)