Python BeautifulSoup 提取特定标签后面的文本

Ama*_*ngh 2 python beautifulsoup web-scraping python-3.x

我正在尝试使用 beautifulsoup 和 python 从网页中提取信息。我想提取特定标签下方的信息。为了知道它是否是正确的标签,我想对其文本进行比较,然后在下一个直接标签中提取文本。
举例来说,如果以下内容是 HTML 页面源代码的一部分,

<div class="row">
    ::before
    <div class="four columns">
        <p class="title">Procurement type</p>
        <p class="data strong">Services</p>
    </div>
  <div class="four columns">
      <p class="title">Reference</p>
      <p class="data strong">ANAJSKJD23423-Commission</p>
  </div>
  <div class="four columns">
      <p class="title">Funding Agency</p>
      <p class="data strong">Health Commission</p>
  </div>
  ::after
</div>
<div class="row">
    ::before
    ::after
</div>
<hr>
<div class="row">
    ::before
    <div class="twelve columns">
        <p class="title">Countries</p>
        <p class="data strong">
            <span class>Belgium</span>
            ", "
            <span class>France</span>
            ", "
            <span class>Luxembourg</span>
        </p>
        <p></p>
    </div>
    ::after
</div>
Run Code Online (Sandbox Code Playgroud)

我想检查是否<p class="title">具有文本值,Procurement type然后我想打印出服务
类似地,如果<p class="title">具有文本值,那么Reference我想打印出ANAJSKJD23423-Commission,如果<p class="title">具有值,Countries则打印出所有国家/地区,即比利时、法国、卢森堡

我知道我可以提取所有文本并将<p class="data strong">它们附加到列表中,然后使用索引获取所有值。但问题是,这些发生的顺序<p class="title>并不是固定的……在某些地方,国家可能会出现在采购类型之前。因此,我想对文本值执行检查,然后提取下一个直接标记的文本值。我对 BeautifulSoup 还很陌生,所以非常感谢您的帮助。谢谢

Kun*_*duK 5

您可以通过多种方式做到这一点。开始吧。

from bs4 import BeautifulSoup
htmldata='''<div class="row">
    ::before
    <div class="four columns">
        <p class="title">Procurement type</p>
        <p class="data strong">Services</p>
    </div>
  <div class="four columns">
      <p class="title">Reference</p>
      <p class="data strong">ANAJSKJD23423-Commission</p>
  </div>
  <div class="four columns">
      <p class="title">Funding Agency</p>
      <p class="data strong">Health Commission</p>
  </div>
  ::after
</div>
<div class="row">
    ::before
    ::after
</div>
<hr>
<div class="row">
    ::before
    <div class="twelve columns">
        <p class="title">Countries</p>
        <p class="data strong">
            <span class>Belgium</span>
            ", "
            <span class>France</span>
            ", "
            <span class>Luxembourg</span>
        </p>
        <p></p>
    </div>
    ::after
</div>'''

soup=BeautifulSoup(htmldata,'html.parser')

items=soup.find_all('p', class_='title')
for item in items:
    if ('Procurement type' in item.text) or ('Reference' in item.text):
        print(item.findNext('p').text)
Run Code Online (Sandbox Code Playgroud)