【问题标题】:Find string with tag search inside a line using Beautifuloup使用 Beautifulsoup 在一行内查找带有标签搜索的字符串
【发布时间】:2021-06-22 10:42:01
【问题描述】:

我要从<p class="answer"> <i class="fa fa-circle" aria-hidden="true"></i> holy place</p>中提取圣地

播放来自 <p class="answer"><i class="fa fa-circle" aria-hidden="true"></i> plays</p>

HTML 源代码

 <div class="card card-custom custom-color">
                <h1 class="card-header card-custom-font">A pilgrim is a person who undertakes a journey to a --- <br>
                </h1>

                                <div class="card-body">
                    <div class="row">
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle" aria-hidden="true"></i> holy place</p>
                        </div>
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle-o" aria-hidden="true"></i> a mosque</p>
                        </div>
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle-o" aria-hidden="true"></i> a bazar</p>
                        </div>
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle-o" aria-hidden="true"></i> a new country</p>
                        </div>
                                            </div>

<div class="card card-custom custom-color">
                <h1 class="card-header card-custom-font">Shakespeare is known mostly for his--- <br>
                </h1>

                                <div class="card-body">
                    <div class="row">
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle-o" aria-hidden="true"></i> poetry</p>
                        </div>
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle-o" aria-hidden="true"></i> novels</p>
                        </div>
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle-o" aria-hidden="true"></i> autobiography</p>
                        </div>
                                                <div class="col-sm-12">
                            <p class="answer"><i class="fa fa-circle" aria-hidden="true"></i> plays</p>
                        </div>
                                            </div>
    

我的代码

question_block = soup.find_all('div', attrs = {'class':'card card-custom custom-color'})

right_answer = question_block.find('p', attrs={'class':'answer','i':'fa fa-circle'}).get_text(strip=True)

获取输出:None

提前致谢,我们将非常感谢您的回答。

快乐编码:)

【问题讨论】:

    标签: python-3.x beautifulsoup


    【解决方案1】:

    您想在每个问题块上调用适当的 css 模式。在这种情况下,.answer &gt; .fa-circle 会将您移动到您想要的值附近,然后next_sibling 将返回您想要的值:

    from bs4 import BeautifulSoup as bs
    
    html = '''your html'''
    soup = bs(html, 'lxml')
    question_blocks = soup.find_all('div', attrs = {'class':'card card-custom custom-color'})
    
    for q in question_blocks:
        # print(q)
        print(q.select_one('.card-header').text)
        print(q.select_one('.answer > .fa-circle').next_sibling.strip())
        print('*' * 50)
    

    【讨论】:

    • 非常感谢@QHarr。这就是我正在寻找的。工作完美。再次感谢。
    【解决方案2】:

    我已将您的数据作为 html 格式,我使用 css 选择器定位元素 i 标记并循环它以查找包含正确答案文本的前一个标记

    from bs4 import BeautifulSoup
    soup=BeautifulSoup(html,"html.parser")
    main_div=soup.select("p > i.fa.fa-circle")
    for data in main_div:
        print(data.find_previous('p').text)
    

    输出:

    holy place
    plays
    

    【讨论】:

      【解决方案3】:

      您可以直接选择类名为answerp,并提取其中的文本。

      x = soup.find('p', class_="answer")
      print(x.text)
      

      此代码将仅从 p 标记中提取 圣地plays

      p = soup.findAll('p', class_='answer')
      for i in p:
          if i.text.strip() in ('plays', 'holy place'):
              print(i.text.strip())
      
      Output:
      
      holy place
      plays
      

      【讨论】:

      • 感谢@Ram 的回复。但我只需要 4 个中的 圣地 并且所有列表的顺序都不相同。你能建议我怎么做吗?
      • @Mehady 你可以做一个简单的字符串匹配。只选择文本为“圣地”的p标签。
      • 再次感谢您的回复@Ram,我已经编辑了源代码。你能看看并建议我吗?
      • 再次感谢。我在源代码中添加了两个块,我可能有 1M 块数据。所以我不能对所有答案进行字符串搜索。我希望你明白我的意思。您还有什么建议吗?
      • @Mehady 您在问题中没有提到所有这些事情吗?在问题中明确发布您对我们的期望。谢谢!
      猜你喜欢
      • 2023-04-10
      • 2023-01-31
      • 2021-07-16
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多