2016-11-30 9 views
0

をチェックdivのコンテンツを抽出し、私はこのようなHTMLページがあります。パイソン/ BeautifoulSoup - H1テキスト

<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 1</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div> 

<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 2</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div> 

を私はタイトルが「Title 2」に等しい場合にのみ、class bodydivからコンテンツを抽出する必要があります。親コンテナには特定のIDまたはクラスがないため、div32の内容を認識するにはh1のテキストが唯一の方法です。現時点では私はこのコードを使用します

from bs4 import BeautifoulSoup 

# code to open the webpage 
soup = BeautifulSoup(data, 'lxml') 
body_content = soup.findAll('div', {'class':'class1'})[1] 

をしかし、それは私が興味のdivは常にページの第二の一つであることを前提とするので、これは、非常にエレガントではありません - それはチェックしませんタイトル。

答えて

1

まあ、私は考えることができる唯一のソリューションは、以下のようなものです:

soup = BeautifulSoup(html,"html.parser") 
    result_tags = soup.find_all(name='div',class_='class1') 
    body_content = [tag for tag in result_tags if 'Title 2' in tag.prettify()][0] 

それはあなたのターゲットのdivがページの第二の1であると仮定していないので、それはあなたの元のコードよりも優れています。

0
html = '''<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 1</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div> 

<div class="class1"> 
    <div class="head"> 
     <h1 class="title">Title 2</h1> 
    <div class="body"> 
<!-- some body content --> 
    </div> 
    </div> 
</div>''' 

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html, 'lxml') 
soup.find(lambda tag: tag.get('class')==['class1'] and 'Title 2' in tag.text) 

か:

def T2_tag(tag): 
    return tag.get('class')==['class1'] and 'Title 2' in tag.text 
soup.find(T2_tag)