如何在标签内容之前选择标签?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (65)

我有一个看起来像这样的html页面:

<div>
<h1>First Item</h1>
<p> the text I want </p>
</div>

<div>
<h1>Second Item</h1>
<p> the text I don't want </p>
</div>

“First Item”的标题可以位于每个页面刮擦中的不同标签级别,因此索引不固定。

我想要一些看起来像的选择(这是一个伪代码)。

from lxml import html

locate_position = locate(html.xpath(//div/h1[contains("First Item")])))

scrape = html.xpath(//div[locate_position]/p)
提问于
用户回答回答于

如果你只想匹配前面:

/p/preceding-sibling::h1[contains("First Item")]

更接近您的示例的选项是:

/div[h1[contains("First Item")]]/p

得到的p是拥有h1子元素的div的子元素。

用户回答回答于

如果您准备考虑使用bs4 4.7.1,这很容易。您可以使用:contains pseudo class指定h1必须包含搜索字符串和相邻的兄弟组合子来指定匹配必须p紧跟在之后的标记。

相邻的兄弟组合子(+)分隔两个选择器,并且仅当它紧跟在第一个元素之后才匹配第二个元素,并且它们都是同一父元素的子元素。

from bs4 import BeautifulSoup as bs

html = '''
<div>
<h1>First Item</h1>
<p> the text I want </p>
</div>

<div>
<h1>Second Item</h1>
<p> the text I don't want </p>
</div>
'''

soup = bs(html, 'lxml')

#multiple matches possible
matches = [match.text for match in soup.select('h1:contains("First Item") + p')]
print(matches)

# first match (useful if only one match expected or first required)
soup.select_one('h1:contains("First Item") + p').text

扫码关注云+社区

领取腾讯云代金券