2010-05-25 8 views
3

Начиная от входа Html как это:Как добавить тег после ссылки с BeautifulSoup

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

с использованием 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> 

Можно сделать это с помощью 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

+2

На самом деле эта конкретная манипуляция не является тривиальной, чтобы забрать из документации. –

ответ

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 = "ОК"; link_tag.insert_after (b) 'должен работать. – contrebis

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

Это работает для примера, вы даете, хотя я m не уверен, что это единственный или самый эффективный метод.

+0

Я думаю, что последняя строка должна быть 'link_tag.parent.insert (link_tag_idx + 1, BeautifulSoup ("
"))', так как «<" and ">» не корректно преобразовываются на мою машину. – sup