【问题标题】:Beautiful Soup: Test if a div is children of a divBeautiful Soup: 测试一个 div 是否是一个 div 的子元素
【发布时间】:2021-12-29 08:56:46
【问题描述】:

是否可以使用Beautiful Soup 测试一个 div 是否是(不是必然直接)一个 div 的子级?

例如。

<div class='a'>
  <div class='aa'>
    <div class='aaa'>
      <div class='aaaa'>
      </div>
    </div>
  </div>
  <div class='ab'>
    <div class='aba'>
      <div class='abaa'>
      </div>
    </div>
  </div>
</div>

现在我想测试具有 aaaa 类的 div 和具有 abaa 类的 div 是否是(不一定是直接的)具有类 aa 的 div 的子级。

import bs4

with open('test.html','r') as i_file:
  soup = bs4.BeautifulSoup(i_file.read(), 'lxml')
div0 = soup.find('div', {'class':'aa'})
div1 = soup.find('div', {'class':'aaaa'})
div2 = soup.find('div', {'class':'abaa'})

print(div1 in div0)  # must return True, but returns False
print(div2 in div0)  # must return False

如何做到这一点?

(当然,实际的 HTML 更复杂,嵌套的 div 更多。)

【问题讨论】:

    标签: python html beautifulsoup


    【解决方案1】:

    您可以使用 Beautifulsoup 中的find_parent 方法。

    import bs4
    
    with open("test.html", "r") as i_file:
        soup = bs4.BeautifulSoup(i_file.read(), "lxml")
    
    div0 = soup.find("div", {"class": "aa"})
    div1 = soup.find("div", {"class": "aaaa"})
    div2 = soup.find("div", {"class": "abaa"})
    
    
    print(div1.find_parent(div0.name, attrs=div0.attrs) is not None)  # Returns True
    print(div2.find_parent(div0.name, attrs=div0.attrs) is not None)  # Returns False
    

    【讨论】:

      【解决方案2】:

      尝试使用find_all_next 查找所有子元素,并查看子元素是否具有所需的类属性。

      from bs4 import BeautifulSoup
      
      soup = BeautifulSoup(text, "html.parser")
      
      
      def is_child(element, parent_class, child_class):
          return any(
              child_class in i.attrs['class']
              for i in soup.find("div", attrs={"class": parent_class}).find_all_next(element)
          )
      
      
      print(is_child("div", "aa", "aaa"))  # True
      print(is_child("div", "abaa", "aa"))  # False
      

      【讨论】:

      • 我没有投反对票,但实际上我想要的是:print(is_child("div", 'aa', 'aaaa')); print(is_child("div", 'aa', 'abaa'))
      【解决方案3】:

      好吧,我想我找到了办法。您必须使用find_all 获取父 div 的所有子 div:

      import bs4
      
      with open('test.html','r') as i_file:
        soup = bs4.BeautifulSoup(i_file.read(), 'lxml')
      
      div0 = soup.find('div', {'class':'aa'})
      div1 = soup.find('div', {'class':'aaaa'})
      div2 = soup.find('div', {'class':'abaa'})
      
      children = div0.find_all('div')
      print(div1 in children)
      print(div2 in children)
      

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 2014-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2022-01-25
        相关资源
        最近更新 更多