在BeautifulSoup中选择除具有某些类的div以外的所有div

时间:2019-10-09 19:22:40

标签: python python-3.x class beautifulsoup

正如this question中所讨论的,可以很容易地获得具有特定类的所有div。但是在这里,我有一个要排除的类列表,并希望获得列表中没有任何类的所有div。

对于

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

现在要获取不包含上面列出的类的所有div。我该如何实现?

2 个答案:

答案 0 :(得分:3)

使用CSS选择器,请尝试以下操作:

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

参考

  1. Link 1
  2. Link 2

答案 1 :(得分: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'))

这可能会留下一些额外的空间,但是您以后可以轻松将其剥离。