<h3>
<span></span>
<span class='headline'>Headline #1</span>
</h3>
<table class='striped'></table>
<h4>
<span class='headline'>Headline #2</span>
</h4>
<table class='striped'></table>
<p>
<span class='headline'>Headline #3</span>
</p>
<ul></ul>
<center>
<table class='striped'></table>
</center>
这是我的结构。我正在枚举表格标签,并希望使用距我的表格最近的“标题”类来检索跨度标签的文本值。 “最接近”是指如果要弄平html,我想使用“标题”类来定位跨度,如果您从表的位置开始,则会首先遇到该类“ ”。
有时,这些跨度嵌套在h3(有时是h4,有时是p)标记中。有时表标签与h3 / h4 / p处于同一级别,有时表本身嵌套在中心标签内。有时h3 / h4 / p标签是表的直接同级,有时不是。
我如何使用BeautifulSoup查找最近的span.headline,而不管嵌套级别如何,以及是否嵌套在父级或同级内部?
到目前为止,我已经有了这段代码
tables = soup.findAll("table", {"class": ["striped"]})
for index, table in enumerate(tables):
headline = table.find_previous('h3').("span", {"class" : ["headline"]}).text
答案 0 :(得分:1)
我能够在每个表上使用find_previous
方法来查找您提供的示例html的先前标题。我向每个表添加了一个额外的idx
属性,以在检查标题是否属于该表时使用。我还在html的开头和结尾添加了两个没有前一个标题的表。
html = '''
<table class='striped'></table>
<h3>
<span></span>
<span class='headline'>Headline #1</span>
</h3>
<table class='striped'></table>
<h4>
<span class='headline'>Headline #2</span>
</h4>
<table class='striped'></table>
<p>
<span class='headline'>Headline #3</span>
</p>
<ul></ul>
<center>
<table class='striped'></table>
</center>
<table class='striped'></table>
</div>
'''.replace('\n', '')
soup = BeautifulSoup(html, 'lxml')
table_query = ('table', {'class': 'striped'})
headline_query = ('span', {'class': 'headline'})
for idx, table in enumerate(soup.find_all(*table_query)):
table.attrs['idx'] = idx
previous_headline = table.find_previous(*headline_query)
if (previous_headline and
previous_headline.find_next(*table_query).attrs['idx'] == idx):
print(previous_headline.text)
else:
print('No headline found.')
输出:
No headline found.
Headline #1
Headline #2
Headline #3
No headline found.