为了账号安全,请及时绑定邮箱和手机立即绑定

Python BeautifulSoup 在特定标签之后提取文本

Python BeautifulSoup 在特定标签之后提取文本

largeQ 2022-01-05 20:03:13
我正在尝试使用 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>我想检查是否<p class="title">有文本值,Procurement type然后我想打印出服务同样,如果<p class="title">有文本值,Reference那么我想打印出ANAJSKJD23423-Commission,如果<p class="title">有值,Countries则打印出所有国家,即比利时,法国,卢森堡。我知道我可以提取所有文本<p class="data strong">并将它们附加到列表中,然后使用索引获取所有值。但问题是,这些发生的顺序<p class="title>是不固定的……有些地方可能会在采购类型之前提到国家。因此,我想对文本值进行检查,然后提取下一个直接标记的文本值。我还是 BeautifulSoup 的新手,因此感谢您提供任何帮助。谢谢
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

你可以用很多方法来做。给你。


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)



查看完整回答
反对 回复 2022-01-05
?
Qyouu

TA贡献1786条经验 获得超11个赞

您还可以:contains在 bs4 4.7.1 中使用伪类。虽然我已经通过了一个列表,但您可以将每个条件分开


from bs4 import BeautifulSoup as bs

import re


html = 'yourHTML'   

soup = bs(html, 'lxml')

items=[re.sub(r'\n\s+','', item.text.strip()) for item in soup.select('p.title:contains("Procurement type") + p, p.title:contains(Reference) + p, p.title:contains(Countries) + p')]

print(items)

输出:

//img1.sycdn.imooc.com//61d589670001b79608420041.jpg

查看完整回答
反对 回复 2022-01-05
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您可以添加参数检查,当你使用特定的文本.find()或.find_all()再使用.next_sibling或findNext()抓住与内容的下一个标签


IE:


soup.find('p', {'class':'title'}, text = 'Procurement type')

鉴于:


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>'''

你可以这样做:


from bs4 import BeautifulSoup     


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


alpha = soup.find('p', {'class':'title'}, text = 'Procurement type')

for sibling in alpha.next_siblings:

    try:

        print (sibling.text)

    except:

        continue

输出:


Services

或者


ref = soup.find('p', {'class':'title'}, text = 'Reference')

for sibling in ref.next_siblings:

    try:

        print (sibling.text)

    except:

        continue

输出:


ANAJSKJD23423-Commission    

或者


countries = soup.find('p', {'class':'title'}, text = 'Countries')

names = countries.findNext('p', {'class':'data strong'}).text.replace('", "','').strip().split('\n')

names = [name.strip() for name in names if not name.isspace()]


for country in names:

    print (country)

输出:


Belgium

France

Luxembourg


查看完整回答
反对 回复 2022-01-05
  • 3 回答
  • 0 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信