我有一个像这样的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 body
从Title 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总是页面的第二个 - 它不会检查标题。
答案 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)