代码之家  ›  专栏  ›  技术社区  ›  aBlaze

Python BeautifulSoup:如何找到所有最低级别的div(不包含嵌套div的div)?

  •  2
  • aBlaze  · 技术社区  · 6 年前

    我有一个复杂的HTML文档 <div> 标签,例如:

    <html>
        <body>
            <div id="one">
                <p>1. Get this div!</p>
            </div>
            <div id="two">
                <div>
                    <div id="three">
                        <p>2. Get this div!</p>
                    </div>
                </div>
                <div id="four">
                    <p>3. Get this div!</p>
                </div>
            </div>
        </body>
    </html>
    

    我正在尝试使用以下代码:

    soup = BeautifulSoup(html, 'html.parser')
    div_list = soup.find_all('div')
    

    但是,上面的代码只获取最顶层的div,这意味着它只返回id为“one”和“two”的div。

    2 回复  |  直到 6 年前
        1
  •  0
  •   DYZ    6 年前

    [d for d in soup.findAll('div') if not d.find('div')]
    #[<div id="one"><p>1. Get this div!</p></div>, 
    # <div id="three"><p>2. Get this div!</p></div>, 
    # <div id="four"><p>3. Get this div!</p></div>]
    
        2
  •  1
  •   Ajax1234    6 年前

    最简单的方法是用所需的id创建一个列表,然后使用 re.compile :

    from bs4 import BeautifulSoup as soup
    import re
    ids = ['one', 'three', 'four']
    results = soup(content, 'html.parser').find_all('div', {'id':re.compile('|'.join(ids))})
    for i in results:
     print(i)
     print('-'*20)
    

    输出:

    <div id="one">
    <p>1. Get this div!</p>
    </div>
    --------------------
    <div id="three">
    <p>2. Get this div!</p>
    </div>
    --------------------
    <div id="four">
    <p>3. Get this div!</p>
    </div>
    --------------------
    

    def get_ids(_d):
      if not any(getattr(i, '__dict__', {}).get('name') == 'div' for i in _d.__dict__['contents']):
         return _d 
      _r = [get_ids(i) for i in _d.__dict__['contents'] if getattr(i, '__dict__', {}).get('name') == 'div']
      return None if not _r else _r[0]
    
    final_results = []
    for i in [get_ids(i) for i in soup(content, 'html.parser').find_all('div')]:
      if i not in s:
         s.append(i)
    
    print(final_results)
    

    输出:

    [<div id="one"><p>1. Get this div!</p></div>, <div id="three"><p>2. Get this div!</p></div>, <div id="four"><p>3. Get this div!</p></div>]