python
  • web-scraping
  • beautifulsoup
  • 2016-07-28 9 views 1 likes 
    1

    サブ要素のないサブ要素:は、要素のすべてのサブ要素を取得しますが、私は次のHTML持っ

    <div class="what-im-after"> 
        <p> 
         "content I want" 
        </p> 
        <p> 
         "content I want" 
        </p> 
        <p> 
         "content I want" 
        </p> 
        <div class='not-what-im-after"> 
         <p> 
          "content I don't want" 
         </p> 
        </div> 
        <p> 
         "content I want" 
        </p><p> 
         "content I want" 
        </p> 
    </div> 
    

    私はサブ要素ある段落タグからすべてのコンテンツを抽出しようとしているが<div class="what-im-after">コンテナのコンテナですが、<div class="not-what-im-after">コンテナ内にはコンテナはありません。

    私が行うときに、この:

    私は私に完全に理にかなって <div class='not-what-im-after>、内のものを含め、すべての <p>タグを、取り戻す
    soup = Beautifulsoup(html.text, 'lxml') 
    content = soup.find('div', class_='what-im-after').findAll('p') 
    

    。それが私が求めているものです。

    私の質問は、別のSubElementに含まれていない限り、すべての<p>タグを取得するようにPythonに指示する方法です。

    答えて

    1

    何がしたいことは、あなただけの他のタグ内ではありませんwhat-im-afterのdivの下のpタグたい場合 = Falseを再帰的を設定することです:あなたのループロジックとまったく同じである

    soup = BeautifulSoup(html) 
    
    print(soup.find('div', class_='what-im-after').find_all("p", recursive=False)) 
    

    を親をチェックする。

    +1

    優れている、毎回親を確認するより効率的なようです。私はBeautifulSoupの 'recursive = False'機能の適用を本当に理解していませんでしたが、今は行います。 – theeastcoastwest

    0

    この質問を書く過程で、うまくいくと思われるアプローチが思い浮かびました。

    基本的には、それぞれの<p>要素をチェックして、親要素が<div class="what-im-after">であるかどうかを確認しています。サブ要素内にネストされている<p>タグは実質的に除外されています。次のように

    私のコードは次のとおりです。

    filter_list = [] 
    
    parent = soup.find('div', class_='what-im-after') 
    content = soup.find('div', class_='what-im-after').findAll('p') 
    
    if content.parent is parent: 
        filter_list.append(content) 
    

    filter_listは、他のサブ要素内にネストされていない<p>すべてのタグが含まれています。

    +0

    @padriacの回答は、このようにデータを取得するためのBeautifulsoupの組み込み機能を考慮しています。私はその方法がより効率的であり、この答えより良いアプローチだと考えています。 – theeastcoastwest

    -1

    多分これが欲しいです。 そして、divの最初のレベルの子要素をフィルタリングするだけです。

    関連する問題