2010-01-15 13 views
8

Chcę użyć BeautfulSoup do wyszukiwania i zamiany <\a> z <\a><br>. Wiem, jak otworzyć z urllib2, a następnie przeanalizować, aby wyodrębnić wszystkie znaczniki <a>. Co chcę zrobić, to wyszukać i zastąpić zamykający tag tagiem zamykającym plus przerwą. Każda pomoc, bardzo doceniana.Wyszukiwanie i zamienianie w HTML za pomocą BeautifulSoup

EDIT

Przypuszczam, że będzie to coś podobnego do:

soup.findAll('a'). 

w dokumentacji jest:

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

Więc zakładam, że będzie zgodnie z:

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

Ale to nie działa i pomaga python() nie daje znacznie

Odpowiedz

15

To będzie wstawić <br> tag po zakończeniu każdego <a>...</a> element:

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

nie można używać soup.findAll(tag = '</a>') ponieważ BeautifulSoup nie działa osobno na etykietach końcowych - są one uważane za część tego samego elementu.


Jeśli chciał umieścić <a> elementy wewnątrz elementu <p> jak zapytać w komentarzu, można użyć tego:

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

Znowu nie stworzyć <p> i </p> osobno ponieważ są częścią tego samego.

+0

wola dodać to również do każdego otwierającego tagu ? – Kevin

+0

Zobacz moją edycję - Zostanie dodany po całym elemencie ..., tak skutecznie, będzie to dopiero po. – interjay

+0

Czy BeautifulSoup.Tag jest prawidłowy? Podczas próby wykonania tego kodu pojawia się błąd. – Kevin

3

Nie zamieniasz etykiety końcowej; w BeautifulSoup masz do czynienia z modelem obiektu dokumentu, jak w przeglądarce, a nie ciągiem pełnym HTML. Nie można więc "zastąpić" tagu końcowego bez zastępowania tagu startowego.

Co należy zrobić, to wstawić nowy element <br> bezpośrednio za elementem <a>...</a>. Aby to zrobić, musisz znaleźć indeks elementu <a> w jego elemencie macierzystym i wstawić nowy element tuż za tym indeksem. na przykład.

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

Czy mógłbym dodać znaczniki przed wartością -1. Załóżmy, że chcę wykonać

i

. Czy przed użyciem indeksu -1 i

mogę użyć tylko numeru

po użyciu +1? – Kevin

+0

Dodałeś element * przed * wybranym elementem za pomocą 'index', a nie plus lub minus cokolwiek. – bobince

3

załóżmy, że masz element, który znasz zawiera „BR” tagi znaczników, jeden sposób, aby usunąć & zastąpić „BR” tagi z innym ciągiem jest tak:

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

To pomogło. Dzięki :) – subodhkalika

Powiązane problemy