【问题标题】:Select all divs except ones with certain classes in BeautifulSoup选择除 BeautifulSoup 中某些类的所有 div
【发布时间】:2019-10-09 19:22:40
【问题描述】:

正如this question 中所讨论的,人们可以很容易地获得具有某些类的所有divs。但是在这里,我有一个我想要排除的类列表,并且想要获取列表中没有任何类的所有 div。

例如

classToIgnore = ["class1", "class2", "class3"]

现在想要获取所有不包含上面提到的类的 div 列表。我怎样才能做到这一点?

【问题讨论】:

    标签: python python-3.x class beautifulsoup


    【解决方案1】:

    使用 CSS 选择器,试试这个:

    divs = soup.select("div:not('.class1, .class2, .class3')")
    
    

    参考

    1. Link 1
    2. Link 2

    【讨论】:

    • 感谢您的回答。尽管我需要将所有类都变成单独的单个逗号,例如 ('.class1', '.class2', '.class3') 才能使其工作。另外,class 必须是div 中的第一个属性吗?
    • 不,属性可以在标签中的任何位置,它们的顺序应该不会有任何影响。
    【解决方案2】:

    替代解决方案

    soup.find_all('div', class_=lambda x: x not in classToIgnore)
    

    例子

    from bs4 import BeautifulSoup
    html = """
    <div class="c1"></div>
    <div class="c1"></div>
    <div class="c2"></div>
    <div class="c3"></div>
    <div class="c4"></div>
    """
    soup = BeautifulSoup(html, 'html.parser')
    classToIgnore = ["c1", "c2"]
    print(soup.find_all('div', class_=lambda x: x not in classToIgnore))
    

    输出

    [<div class="c3"></div>, <div class="c4"></div>]
    

    如果您正在处理嵌套类,请尝试使用 decompose 删除内部不需要的类,然后只使用 find_all('div')

    for div in soup.find_all('div', class_=lambda x: x in classToIgnore):
        div.decompose()
    print(soup.find_all('div'))
    

    这可能会留下一些额外的空间,但您可以稍后轻松地将其删除。

    【讨论】:

    • 它看起来应该可以工作,但它没有排除任何类。
    • @HarshilDoshi 我不知道为什么。我已经包含了一个工作示例。
    • 我想问题出在我的情况下,有时 divc1c2div 的一部分 c3c4。意味着在嵌套的 div 中,被排除的仍将作为包含的一部分。
    • 简单而优雅。像魅力一样工作。谢谢。
    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2015-03-05
    • 2016-03-07
    • 2022-01-22
    相关资源
    最近更新 更多