Выберите все div, кроме тех, которые имеют определенные классы в BeautifulSoup - PullRequest
1 голос
/ 09 октября 2019

Как обсуждалось в , этот вопрос можно легко получить все div с определенными классами. Но здесь у меня есть список классов, которые я хочу исключить и хочу получить все элементы div, для которых в списке нет классов.

Для т.е.

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

Сейчасхочу получить все div, которые не содержат перечисленных выше классов. Как я могу этого достичь?

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Используя CSS селектор, попробуйте следующее:

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

Ссылка

  1. Ссылка 1
  2. Ссылка 2
2 голосов
/ 09 октября 2019

Альтернативное решение

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>]

Если вы имеете дело с вложенными классами, попробуйте удалить внутренние нежелательные классы, используя разложить , а затем просто find_all('div')

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

Это может оставить некоторые дополнительные пробелы, но вы можете легко удалить их позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...