2010-05-25 93 views
3

从HTML输入这样开始一个链接后追加:使用BeautifulSoup如何将标签与BeautifulSoup

<p> 
<a href="http://www.foo.com">this if foo</a> 
<a href="http://www.bar.com">this if bar</a> 
</p> 

,我想在更改此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> 

是否有可能使用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 
+0

是的,这是可能的。 BeautifulSoup有相当不错的文档: http://www.crummy.com/software/BeautifulSoup/documentation.html 发布您的代码,如果你有问题,我(和其他人)会帮助。 – Jack 2010-05-25 20:50:41

+2

实际上这个特殊的操作并不是从文档中提取的。 – 2010-05-26 13:16:42

回答

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 

应该给你:

<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> 
+9

请注意,对于任何人从Google等打这个答案,在BS4有一个insert_after()方法,例如:'b = soup.new_tag(“b”); b.string =“确定”; (b)'应该工作。 – contrebis 2012-09-17 20:03:39

7

您可以使用BeautifulSoup的insert在正确的地方添加的元素:

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>') 

这适用于你给的例子,虽然我”米不知道这是唯一或最有效的方法。

+0

我认为最后一行应该是'link_tag.parent.insert(link_tag_idx + 1,BeautifulSoup(“
”))',因为“<" and ">”没有在我的机器上正确转换。 – sup 2013-10-29 22:58:41