2016-10-18 3 views
1

Angenommen, ich habe folgende html:ausschließen Artikel von Web-Scraped Schleife

<h4> 
    <a href="http://www.google.com">Google</a> 
</h4> 
<h4>Random Text</h4> 

Ich bin in der Lage, alle h4 Schriften über eine Schleife zu identifizieren, wie zum Beispiel:

for url in soup.findAll("h4") 
    print(url.get_text()) 

Und das funktioniert gut, außer Es enthält das Element "Random Text" der Überschrift h4. Ist es möglich, Vorkommen von h4 Überschriften programmatisch zu entfernen, die bestimmte Kriterien nicht erfüllen, z. B. solche, die keine Verknüpfung enthalten?

Antwort

3

Sicher, können Sie mit einem einfachen Ansatz zu gehen, einfach die Überschriften Filterung:

for url in soup.find_all("h4") 
    if not url.a: # "url.a" is a shortcut to "url.find('a')" 
     continue 
    print(url.get_text()) 

Oder eine bessere Möglichkeit, sie mit einem function zu filtern wäre:

for url in soup.find_all(lambda tag: tag.name == "h4" and tag.a): 
    print(url.get_text()) 

Oder sogar besser, gehen Sie direkt zu den a Elemente:

for url in soup.select("h4 > a"): 
    print(url.get_text()) 

h4 > a Hier ist eine CSS selector, die a Elemente entsprechen würde, die direkte Kinder von h4 Tags sind.

+0

Oder 'wenn url.a: print (url.get_text())' –

0

Verwenden Liste Verständnis als der pythonic Ansatz:

[i.get_text() for i in soup.findAll("h4") if #Insert criteria here#] 
+1

Während Verständnis mit Liste ist schön und ist in diesem Fall dieses anwendbar beantwortet nicht die Frage, die das OP stellt ... besser für diese Antwort, um ein Kommentar zu sein imho. – alecxe

+0

Welcher Teil der Frage beantwortet sie nicht? –

+1

Okay, nichts für ungut, natürlich, aber wo in der Antwort filtern Sie die Überschriften, die keine Links enthalten? – alecxe