2016-08-07 9 views
1

私はwired.comから記事を取得しようとしています。 は、一般的にこのような彼らの記事のコンテンツの外観:BeautifulSoup:findAll再帰が機能しない

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

またはこのような:だから私は、ページがタイプ1であればページであればながら、<p><h>は、抽出され

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

    </div> 

</article> 

をしたいですタイプ2である - 他の何かをする。したがって、<p><h><article>の直系子孫の場合は、タイプ1です。 次のコードを試しましたが、<p><h>を探してタグ名を出力します。問題は、recursive="False"は、タイプ2のページでテストしたときにタグを見つけることができないためです(NonTypeオブジェクトを取得すると思われたため)。

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")) 

なぜ機能しませんか?

PSさらに、findAllfindChildrenを使用している場合と、この特定のケースでは違いがありますか?これら二つは...私には同じように見える

答えて

2

リテラル"False"使用と同じではありません文字列ブールFalse、あなたが実際にrecursive=False渡す必要があります:任意の非空の文字列をしようとしている

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

真理値と見なされると、あなたが渡すことができる唯一の文字列は、空の文字列、つまりrecursive=""になります。あなたがを見つけることができませんfind_allを呼び出しているよう

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

しかし、実際のブールFalseを使用してに固執する、また、あなたは
recursive=False、ないなしで返さ空 リスト/ ResultSetを取得します。

+0

ありがとうございました!それは私の注意を完全に逃した。 – parsecer

+0

いいえ、あなたも大丈夫です。 –

関連する問題