Czy mogę usunąć tagi skryptów za pomocą BeautifulSoup?

93

Czy tagi skryptów i całą ich zawartość można usunąć z HTML za pomocą BeautifulSoup, czy też muszę używać wyrażeń regularnych lub czegoś innego?

Sam
źródło

Odpowiedzi:

164
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'lxml')
>>> for s in soup.select('script'):
>>>    s.extract()
>>> soup
baba
Fábio Diniz
źródło
Jaki jest najlepszy sposób łączenia dodatkowych tagów do usunięcia? W tej chwili to działa, jeśli powtórzę polecenie jedno po drugim, z [s.extract () for s in soup ('script')], a następnie [s.extract () for s in soup ('iframe')] i tak dalej , ale nie jeśli połączę je w łańcuch w ten sposób [s.extract () for s in soup („iframe”, „script”)].
Ila
8
@Ali Musisz użyć [s.extract() for s in soup(['iframe', 'script'])]Zauważ, że aby użyć wielu tagów, parametr musi być listą
Fábio Diniz
@ FábioDiniz Jak wyodrębnić coś takiego: '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? Czy to jest to samo?
user2883071
2
Obiekt zupy staje się bezużyteczny po tej operacji, nie znaleziono już żadnych tagów.
imrek
1
To jest nieaktualne, BeautifulSoup wydaje się teraz formatować ciąg do html:<html><head></head><body><p>baba</p></body></html>
CloC
38

Zaktualizowana odpowiedź dla tych, którzy mogą potrzebować w przyszłości: Prawidłowa odpowiedź to. decompose() Możesz używać różnych sposobów, ale decomposedziała w miejscu.

Przykładowe użycie:

soup = BeautifulSoup('<p>This is a slimy text and <i> I am slimer</i></p>')
soup.i.decompose()
print str(soup)
#prints '<p>This is a slimy text and</p>'

Bardzo przydatne do pozbycia się detrytusów, takich jak „script”, „img” i tak dalej.

Abhishek Dujari
źródło
8
Różnica między decomposei extractpolega na tym, że ta ostatnia zwraca to, co zostało usunięte, podczas gdy ta pierwsza po prostu ją niszczy. To jest dokładniejsza odpowiedź na pytanie, ale inne metody działają.
Mike
1
Dekompozycja nie usuwa zawartości tagów script, a jedynie usuwa tagi.
Roland Pihlakas
Zgadzam się z obydwoma Twoimi uwagami. Dlatego powiedziałem poprawną odpowiedź zgodnie z OP, która była removezawarta. Często używany do czyszczenia kodu HTML z niepotrzebnych tagów i formatowania.
Abhishek Dujari
7
Właściwie zgodnie z dokumentacją: "Tag.decompose () usuwa tag z drzewa, a następnie całkowicie niszczy go i jego zawartość:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Przepraszamy, myślę, że zapomniałem dodać wzmiankę w swoim komentarzu: Myślę, że odpowiadałem Rolandowi Pihlakasowi tym komentarzem.
jarcobi889
23

Jak stwierdzono w ( oficjalnej dokumentacji ), możesz użyć tej extractmetody do usunięcia całego poddrzewa pasującego do wyszukiwania.

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
Santiago Alessandri
źródło
Czy istnieje sposób na usunięcie tagu z określoną klasą? Nie chcę usuwać wszystkich tagów o tej samej nazwie, ale tylko jeden blok tagów z określoną klasą.
mulaixi
Wszystko, co musisz zrobić, to wybrać konkretne elementy do wywołania extract. [x.extract() for x in a.select('span.className')]
Edvard Rejthar