2015-10-15 5 views
6

This question wurde vor vier Jahren gefragt, aber die Antwort ist jetzt veraltet für BS4.So finden Sie alle Kommentare mit Beautiful Soup

Ich möchte alle Kommentare in meiner HTML-Datei mit schönen Suppe löschen. Da BS4 jedes comment as a special type of navigable string macht, dachte ich, dieser Code funktionieren würde:

for comments in soup.find_all('comment'): 
    comments.decompose() 

So funktioniert das nicht .... Wie finde ich alle Kommentare BS4 mit?

+0

Diese [Antwort] (http:// Stackoverflow.com/a/3507360/771848) sollte immer noch funktionieren, nehme ich an. – alecxe

+0

Ich bekomme "globalen Namen 'Kommentar' ist nicht definiert" – Joseph

+1

Ich weiß, das ist alt, aber @Joseph, wenn Sie Kommentar von BS4 importieren, sollte es funktionieren – atarw

Antwort

8

Sie eine Funktion übergeben können find_all(), um zu überprüfen, ob die Zeichenfolge ein Kommentar ist.

Zum Beispiel habe ich unten html haben:

<body> 
    <!-- Branding and main navigation --> 
    <div class="Branding">The Science &amp; Safety Behind Your Favorite Products</div> 
    <div class="l-branding"> 
     <p>Just a brand</p> 
    </div> 
     <!-- test comment here --> 
     <div class="block_content"> 
      <a href="https://www.google.com">Google</a> 
    </div> 
</body> 

Code:

from bs4 import BeautifulSoup as BS 
from bs4 import Comment 
.... 
soup=BS(html,'html.parser') 
comments=soup.find_all(string=lambda text:isinstance(text,Comment)) 
for c in comments: 
    print c 
    print "===========" 
    c.decompose() 

die Ausgabe wäre:

Branding and main navigation 
============ 
test comment here 
============ 

BTW, ich glaube, der Grund, warum find_all('Comment') nicht der Fall ist Arbeit ist (aus BeautifulSoup Dokument):

Übergeben Sie einen Wert für name und Sie werden Beautiful Soup sagen, dass nur Tags mit bestimmten Namen berücksichtigt werden sollen. Textzeichenfolgen werden ignoriert, wie auch Tags, deren Namen nicht übereinstimmen.

+0

Ich bin froh, dass ich deine Antwort gefunden habe, danke! Irgendeine Idee, wie wir es ohne Lambda schreiben könnten? – JinSnow

6

Zwei Dinge, die ich tun musste:

Zuerst, wenn schöne Suppe

Zweite importieren, hier der Code ist Kommentare zu extrahieren

for comments in soup.findAll(text=lambda text:isinstance(text, Comment)): 
    comments.extract() 
Verwandte Themen