【问题标题】:Extracting only single tags in beautifulsoup在beautifulsoup中仅提取单个标签
【发布时间】:2022-11-10 21:56:59
【问题描述】:

我正在寻找一种方法来仅提取其中没有其他标签的标签

例如:

from bs4 import BeautifulSoup
html = """
<p><a href='XYZ'>Text1</a></p>
<p>Text2</p>
<p><a href='QWERTY'>Text3</a></p>
<p>Text4</p>
"""
soup = BeautifulSoup(html, 'html.parser')
soup.find_all('p')

[<p><a href="XYZ">Text1</a></p>,
 <p>Text2</p>,
 <p><a href="QWERTY">Text3</a></p>,
 <p>Text4</p>]

这就是我想要实现的目标:

[<p>Text2</p>,
 <p>Text4</p>]

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    您可以过滤 Tags 而不包含其他标签,如下所示:

    for tag in soup.find_all('p'):
        if isinstance(tag.next, str):
            print(tag)
    

    哪个返回

    <p>Text2</p>
    <p>Text4</p>
    

    【讨论】:

    • 如果适用于提供的示例,但不适用于所要求的。使用.next 不会采取
    【解决方案2】:

    我会在标签的长度上使用if/else 简单地过滤它,如果它只是p 那么它将是空的,否则它将被过滤掉:

    for x in soup.find_all('p'):
        if len([x.tag for x in x.find_all()]) == 0:
            print(x)
    

    仅退货:

    <p>Text2</p>
    <p>Text4</p>
    

    【讨论】:

      【解决方案3】:
      import bs4
      from bs4 import BeautifulSoup
      
      html = """
      <p><a href='XYZ'>Text1</a></p>
      <p>Text2</p>
      <p><a href='QWERTY'>Text3</a></p>
      <p>Text4</p>
      <p>Text6: <a href='QWERTY'>Text5</a></p>
      """
      
      soup = BeautifulSoup(html, 'html.parser')
      
      def only_tags_without_any_other_tags_as_children(tag):
          return tag.name == "p" and not any(isinstance(x, bs4.element.Tag) for x in tag.children)
      
      result = soup.find_all(only_tags_without_any_other_tags_as_children)
      
      print(result)
      

      BeautifulSoup-Documentation for using function-filters on .find_all().

      要检查列表中的类型,请访问。
      https://stackoverflow.com/a/32705845/5288820

      【讨论】:

        猜你喜欢
        • 2016-10-21
        • 2013-04-29
        • 2021-12-05
        • 1970-01-01
        • 2016-10-29
        • 2022-07-22
        • 1970-01-01
        • 2020-01-07
        • 2017-03-13
        相关资源
        最近更新 更多