2010-01-15 96 views
8

我想使用BeautfulSoup來搜索並用<\a><br>替換<\a>。我知道如何用urllib2打開,然後解析以提取所有<a>標籤。我想要做的是搜索並用結束標記加上中斷替換結束標記。任何幫助,非常感謝。用BeautifulSoup在HTML中搜索並替換

編輯

我會以爲這將是類似於:

soup.findAll('a'). 

在本文檔中,有一個:

find(text="ahh").replaceWith('Hooray') 

所以我認爲這將是沿線:

soup.findAll(tag = '</a>').replaceWith(tag = '</a><br>') 

但是,這並不工作,蟒蛇幫助()不給太多

回答

15

這將每個<a>...</a>元素結束後插入一個<br>標籤:

from BeautifulSoup import BeautifulSoup, Tag 

# .... 

soup = BeautifulSoup(data) 
for a in soup.findAll('a'): 
    a.parent.insert(a.parent.index(a)+1, Tag(soup, 'br')) 

不能使用soup.findAll(tag = '</a>'),因爲BeautifulSoup不能單獨在結束標籤上操作 - 它們被認爲是同一元素的一部分。


如果你想把一個<p>元素內的<a>元素您在留言問,你可以使用這個:再次

for a in soup.findAll('a'): 
    p = Tag(soup, 'p') #create a P element 
    a.replaceWith(p) #Put it where the A element is 
    p.insert(0, a)  #put the A element inside the P (between <p> and </p>) 

,你不創造<p></p>分開因爲它們是同一件事的一部分。

+0

意志將它添加到每個開幕標籤以及? – Kevin 2010-01-15 17:57:44

+0

看到我的編輯 - 它將被添加後整個 ...元素,所以有效地,它將只在後。 – interjay 2010-01-15 17:59:25

+0

BeautifulSoup.Tag是否有效?嘗試此代碼時出現錯誤。 – Kevin 2010-01-15 20:43:09

3

您不會替換結束標籤;在BeautifulSoup中,您正在處理瀏覽器中的文檔對象模型,而不是一個完整的HTML字符串。因此,如果不替換起始標籤,您就無法'替換'結束標籤。

你想要做的是在<a>...</a>元素後面插入一個新的<br>元素。爲此,您需要找出其父元素中<a>元素的索引,並在該索引後面插入新元素。例如。

soup= BeautifulSoup('<body>blah <a href="foo">blah</a> blah</body>') 
for link in soup.findAll('a'): 
    br= Tag(soup, 'br') 
    index= link.parent.contents.index(link) 
    link.parent.insert(index+1, br) 
# soup now serialises to '<body>blah <a href="foo">blah</a><br /> blah</body>' 
+0

我能否在-1之前添加標籤?假設我想要做

。在使用+1之後,我可以在

之前使用索引-1和

嗎? – Kevin 2010-01-15 20:30:19

+0

您只需使用'index'在所選元素之前添加*元素,而不加或減任何東西。 – bobince 2010-01-15 22:04:17

3

假設你有,你知道包含「BR」標記標籤的元素,一個地清除&使用不同的字符串替換「BR」標籤是這樣的:

originalSoup = BeautifulSoup("your_html_file.html") 
replaceString = ", " # replace each <br/> tag with ", " 
# Ex. <p>Hello<br/>World</p> to <p>Hello, World</p> 
cleanSoup = BeautifulSoup(str(originalSoup).replace("<br/>", replaceString)) 
+0

它幫助。謝謝 :) – subodhkalika 2018-02-06 12:47:13