2016-08-07 27 views
1

Ich versuche, Artikel von wired.com zu bekommen. Allgemeinen ihre Artikel Inhalt sieht wie folgt aus:Beautifulsoup: findAll rekursiv funktioniert nicht

<article itemprop="articleBody"> 
    <p>Some text</p> 
    <p>Next text</p> 
    <p>...</p> 
    <p>...</p> 
</article> 

oder so:

<article itemprop="articleBody"> 
    <div class="listicle-captions marg-t..."> 
     <p></p> 

    </div> 

</article> 

Deshalb möchte ich, wenn die Seite vom Typ 1, die <p> und <h> extrahiert werden, während, wenn die Seite ist vom Typ 2 - tu etwas anderes. Also, wenn die <p> und <h> sind direkte Nachkommen von <article>, dann ist es Typ 1. Ich habe den folgenden Code versucht, es sucht nach <p> und <h> und druckt die Tag-Namen. Die Sache ist, die recursive="False" scheint nicht zu helfen, denn wenn sie auf der Seite des Typs 2 geprüft wird, findet sie die Umbauten, während es nicht sollte (ich erwartete, ein Objekt zu erhalten).

import urllib.request 
from bs4 import BeautifulSoup 
import datetime 
import html 
import sys 

articleUrl="https://www.wired.com/2016/07/greatest-feats-inventions-100-years-boeing/" 

soupArticle=BeautifulSoup(urllib.request.urlopen(articleUrl), "html.parser") 

articleBody=soupArticle.find("article", {"itemprop":"articleBody"}) 
articleContentTags=articleBody.findAll(["h1", "h2","h3", "p"], recursive="False") 

for tag in articleContentTags: 
    print(tag.name) 
    print(tag.parent.encode("utf-8")) 

Warum funktioniert es nicht?

PS Gibt es auch einen Unterschied zwischen der Verwendung von findAll und findChildren im Allgemeinen und in diesem speziellen Fall? Diese beiden gleich aussehen zu mir ..

Antwort

2

Die Stringliteral "False" ist nicht das gleiche wie die Verwendung booleanFalse, müssen Sie tatsächlich passieren recursive=False:

articleBody.find_all(["h1", "h2","h3", "p"], recursive=False) 

Jede nicht leere Zeichenkette wird zu Als truthy Wert betrachtet werden, die einzige Zeichenfolge, die Sie übergeben könnten, wäre eine leere Zeichenfolge, dh recursive="".

In [17]: bool("False") 
Out[17]: True 

In [18]: bool("foo") 
Out[18]: True 

In [19]: bool("") 
Out[19]: False 

Aber halten die tatsächliche booleanFalse zu verwenden, auch Sie werden eine leere Liste/ResultSet kehrte mit recursive=False, nicht Keine wie du find_all nicht finden fordern erhalten.

+0

Vielen Dank! Es ist meiner Aufmerksamkeit völlig entgangen. – parsecer

+0

Kein Problem, gern geschehen. –