2010-01-15 33 views
8

'u <\a><br> ile aramak ve değiştirmek için BeautfulSoup kullanmak istiyorum. urllib2 ile nasıl açılacağını biliyorum ve ardından tüm <a> etiketlerini ayıklamak için ayrıştırıyorum. Yapmak istediğim, kapanış etiketini artı kapatma ile kapama etiketini aramak ve değiştirmek. Herhangi bir yardım, çok takdir.Arama ve HTML ile Değiştir BeautifulSoup ile

DÜZENLEME

Ben benzer bir şey olurdu varsayılabilir:

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

yüzden olurdu varsayılabilir: belgelerinde

soup.findAll('a'). 

, bir var satırları boyunca:

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

Ama çok

cevap

15

Bu, her <a>...</a> elemanın bitiminden sonra bir <br> etiketi ekler Bu işe yaramazsa ve piton yardımı() vermez:

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

Sen kullanamazsınız soup.findAll(tag = '</a>'), çünkü BeautifulSoup bitiş etiketlerinde ayrı ayrı çalışmıyor - aynı öğenin parçası olarak kabul ediliyorlar. Eğer bir yorum rica olarak <p> öğesinin içinde <a> unsurları koymak istiyorsa


, bu kullanabilirsiniz:

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

Yine, oluşturmayın <p> ve </p> ayrı çünkü aynı şeylerin parçası.

+0

Will o:

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

+0

Benim düzenleme - Bu ... öğesinden sonra eklenecektir, bu yüzden etkili bir şekilde, sadece sonra olacaktır. – interjay

+0

BeautifulSoup.Tag geçerli mi? Bu kodu denerken bir hata alıyorum. – Kevin

3

Bir son etiketi değiştirmezsiniz; BeautifulSoup'ta bir tarayıcıda olduğu gibi bir belge nesnesi modeli ile uğraşıyorsunuz, HTML dolu bir dize değil. Böylece, başlangıç ​​etiketini de değiştirmeden bir bitiş etiketini "değiştiremezsiniz".

Yapmak istediğiniz şey,öğesinden hemen sonra yeni bir <br> öğesi eklemektir. Bunu yapmak için, üst öğesinin içinde <a> öğesinin dizinini bulmanız ve yeni öğeyi bu dizinden hemen sonra eklemeniz gerekir. Örneğin.

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

Etiketleri daha önce -1 ile ekleyebilir miyim? Ben

ve

yapmak istediğimi söyle. +1'i kullandıktan sonra

numaralı dizini ve

'u kullanmadan önce olabilir miyim? – Kevin

+0

Seçtiğiniz elemandan önce * elemanın * indeksini kullanarak, artı ya da eksi olmayan bir eleman * ekleyeceksiniz. – bobince

3

Eğer tek yönlü böyle bir farklı dizeyle "br" etiketleri değiştirmek & kaldırmak için size "br" işaretleme etiketleri içeren biliyorum bir öğe olduğunu varsayalım her açılış etiketine de ekleyin?
+0

Bu yardımcı oldu. Teşekkürler :) – subodhkalika