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?

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

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.