2010-05-24 42 views
1

從HTML輸入這樣開始:如何找到鏈接和修改使用BeautifulSoup的HTML Python中

<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[1]</a> 
<a href="http://www.bar.com">this if bar[2]</a> 
</p> 

節約在字典中的解析鏈接,像這樣的結果:

links_dict = {"1":"http://www.foo.com","2":"http://www.bar.com"} 

是否有可能做到這一點使用BeautifulSoup?任何有效的選擇?

回答

4

這應該很容易在美麗的湯。

喜歡的東西:

from BeautifulSoup import BeautifulSoup 
from BeautifulSoup import Tag 

count = 1 
links_dict = {} 
soup = BeautifulSoup(text) 
for link_tag in soup.findAll('a'): 
  if link_tag['href'] and len(link_tag['href']) > 0: 
    links_dict[count]  = link_tag['href']   
    newTag = Tag(soup, "a", link_tag.attrs) 
    newTag.insert(0, ''.join([''.join(link_tag.contents), "[%s]" % str(count)])) 
    link_tag.replaceWith(newTag) 
    count += 1 

在文本執行這個結果:

>>> soup 
<p> 
    <a href="http://www.foo.com">this if foo[1]</a> 
    <a href="http://www.bar.com">this if bar[2]</a> 
</p> 

>>> links_dict 
{1: u'http://www.foo.com', 2: u'http://www.bar.com'} 

我可以用這個解決方案預見唯一的問題是,如果你的鏈接文字中包含的子標籤;那麼你不能這樣做''.join(link_tag.contents);相反,您需要導航到最右邊的文本元素。

+0

@danben +1努力。其實這就像我在提問之前所做的代碼。它不起作用,因爲你最終得到了像this if foo這不是我想要的東西。 – systempuntoout 2010-05-24 21:42:39

+0

@systempuntoout:編輯;目前的代碼正在爲我工​​作。 – danben 2010-05-24 21:57:49

+0

@danben你認爲是否可以在不重新創建新標籤的情況下更改節點的內容? – systempuntoout 2010-05-25 09:14:30

相關問題