BeautifulSoup获取与类(不是同级兄弟)的最近标签,并嵌套在未知同级兄弟中

时间:2019-01-24 17:41:00

标签: python beautifulsoup

<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

1 个答案:

答案 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.