Kann ich Skript-Tags mit BeautifulSoup entfernen?

90

Können Skript-Tags und alle ihre Inhalte mit BeautifulSoup aus HTML entfernt werden, oder muss ich reguläre Ausdrücke oder etwas anderes verwenden?

Sam
quelle

Antworten:

160
>>> 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
quelle
Was ist der beste Weg, um zusätzliche zu entfernende Tags zu verketten? Im Moment funktioniert es, wenn ich den Befehl nacheinander wiederhole, mit [s.extract () für s in Suppe ('script')], dann [s.extract () für s in Suppe ('iframe')] und so weiter , aber nicht, wenn ich sie so verkette [s.extract () für s in suppe ('iframe', 'script')].
Ila
8
@Ali Sie müssten verwenden [s.extract() for s in soup(['iframe', 'script'])]Beachten Sie, dass der Parameter eine Liste sein muss, um mehrere Tags zu verwenden
Fábio Diniz
@ FábioDiniz Wie würde ich so etwas extrahieren wie : '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? Ist es das Gleiche?
user2883071
2
Das Suppenobjekt wird nach diesem Vorgang unbrauchbar, es werden keine Tags mehr gefunden.
Imrek
1
Dies ist veraltet, BeautifulSoup scheint die Zeichenfolge jetzt auf HTML zu formatieren:<html><head></head><body><p>baba</p></body></html>
CloC
37

Aktualisierte Antwort für diejenigen, die möglicherweise später nachschlagen müssen: Die richtige Antwort lautet. decompose() Sie können verschiedene Methoden verwenden, arbeiten jedoch vor decomposeOrt.

Anwendungsbeispiel:

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

Ziemlich nützlich, um Detritus wie 'script', 'img' usw. loszuwerden.

Abhishek Dujari
quelle
8
Der Unterschied zwischen decomposeund extractbesteht darin, dass Letzteres das entfernte Objekt zurückgibt, während Ersteres es nur zerstört. Dies ist also die genauere Antwort auf die Frage, aber die anderen Methoden funktionieren.
Mike
1
Decompose entfernt nicht den Inhalt von Skript-Tags, sondern nur die Tags.
Roland Pihlakas
Ich stimme Ihren beiden Kommentaren zu. Aus diesem Grund habe ich gemäß OP die richtige Antwort auf den removeInhalt gegeben. Wird häufig zum Bereinigen von HTML von nicht benötigten Tags und zum Formatieren verwendet.
Abhishek Dujari
7
Laut Dokumentation: "Tag.decompose () entfernt ein Tag aus dem Baum und zerstört es dann vollständig und seinen Inhalt:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Entschuldigung, ich glaube, ich habe vergessen, in meinem Kommentar eine Erwähnung hinzuzufügen: Ich glaube, ich habe Roland Pihlakas mit diesem Kommentar geantwortet.
jarcobi889
22

Wie in der ( offiziellen Dokumentation ) angegeben, können Sie mit dieser extractMethode alle Teilbäume entfernen, die der Suche entsprechen.

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
Santiago Alessandri
quelle