2016-06-27 16 views
2

のコンテンツに基づいてタグを除外する私は次のようであるHTMLデータをスクレイピングしています:がBeautifulsoup

<div class="target-content"> 
    <p id="random1"> 
     "the content of the p" 
    </p> 

    <p id="random2"> 
     "the content of the p" 
    </p> 

    <p> 
     <q class="semi-predictable"> 
     "q tag content that I don't want 
     </q> 
    </p> 

    <p id="random3"> 
     "the content of the p" 
    </p> 

</div> 

私の目標は、自分のコンテンツしばらく除外することができることに加えて、すべての<p>のタグを取得することです<q>タグとその内容が含まれています。現在、私は次のようなアプローチですべて<p>のタグを取得:私はすべての<p>タグの結果セットを見つけた後、それはコンテンツだと一緒に

contentlist = soup.find('div', class_='target-content').find_all('p') 

私の質問は、どのように私は、単一<p>をフィルタリングすることができますされ、 <q>が含まれていますか?音符の

soup.find('div', class_='target-content')find_all('p')から結果セットを取得した後、私は繰り返し、次のようにリストに設定された結果から、各<p>を追加してい:

content = '' 
    for p in contentlist: 
     content += str(p) 

答えて

3

あなただけqタグを持つpタグをスキップすることができます内側:p.qp.find("q")へのショートカットです

for p in soup.select('div.target-content > p'): 
    if p.q: # if q is present - skip 
     continue 
    print(p) 

div.target-content > pは、div要素の直接の子であるpのすべてのタグに一致するtarget-contentクラスのCSS selectorです。

+0

は、私が理解しようとしている正確に何をしたこと、ありがとうございます。説明もありがとう。私はBeautifulsoupと同じくらい頻繁にCSSセレクタを使用するとは思わない。 – theeastcoastwest

2

あなたはこれを実現するためにfilterを使用することができます。

filter(lambda e: e.find('q') == None, soup.find('div', class_='target-content').find_all('p')) 
+0

助けてくれてありがとう、上記の@alexceの答えのバリエーションを使用して終了しましたが、あなたも役に立つと判明しました。 – theeastcoastwest