Python / BeautifoulSoup - 提取div内容检查h1文本

时间:2016-11-30 08:51:19

标签: python html beautifulsoup

我有一个像这样的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>

仅当标题等于&#34; div&#34;时,才需要使用class bodyTitle 2中提取内容。由于他们的父容器没有特定的ID或类,因此h1文本是识别所有div的唯一方法。目前我使用此代码:

from bs4 import BeautifoulSoup

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

但这并不是非常优雅,因为它假设我感兴趣的div总是页面的第二个 - 它不会检查标题。

2 个答案:

答案 0 :(得分: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)