猿问

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、有时是 ap 标签中。有时 table 标签与 h3/h4/p 处于同一级别,有时它本身嵌套在 center 标签内。有时 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


繁星coding
浏览 214回答 1
1回答

LEATH

我能够find_previous在每个表上使用该方法来查找您提供的示例 html 的前一个标题。idx在检查标题是否属于该表时,我为每个表添加了一个附加属性。我还在 html 的开头和结尾添加了两个没有以前标题的表格。html = '''<table class='striped'></table><h3>&nbsp; &nbsp; <span></span>&nbsp; &nbsp; <span class='headline'>Headline #1</span></h3><table class='striped'></table><h4>&nbsp; &nbsp; <span class='headline'>Headline #2</span></h4><table class='striped'></table><p>&nbsp; &nbsp; <span class='headline'>Headline #3</span></p><ul></ul><center>&nbsp; &nbsp; <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)):&nbsp; &nbsp; table.attrs['idx'] = idx&nbsp; &nbsp; previous_headline = table.find_previous(*headline_query)&nbsp; &nbsp; if (previous_headline and&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; previous_headline.find_next(*table_query).attrs['idx'] == idx):&nbsp; &nbsp; &nbsp; &nbsp; print(previous_headline.text)&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; print('No headline found.')输出:No headline found.Headline #1Headline #2Headline #3No headline found.
随时随地看视频慕课网APP

相关分类

Python
我要回答