Серийный селектор Beautifulsoup

Я хочу выбрать все div, которые имеют BOTH A и B как атрибуты класса.

Следующий выбор

soup.findAll('div', class_=['A', 'B'])

однако выбирает все divs, которые имеют A или или B в своих атрибутах класса. Классы могут иметь много других атрибутов (C, D и т.д.) В любом порядке, но я хочу выбрать только те, у которых есть A и B.

Ответ 1

Вместо этого используйте css selectors:

soup.select('div.A.B')

Ответ 2

Вместо этого вы можете использовать CSS-селекторы, что, вероятно, является лучшим решением здесь.

soup.select("div.classname1.classname2")

Вы также можете использовать функцию.

def interesting_tags(tag):
    if tag.name == "div":
        classes = tag.get("class", [])
        return "A" in classes and "B" in classes

soup.find_all(interesting_tags)

Ответ 3

1 некоторые теги вроде:

<span class="A B C D">XXXX</span>

если вы хотите использовать селектор CSS для получения тега, вы можете написать код для атрибута класса следующим образом:

spans = beautifulsoup.select('span.A.B.C.D')

2 И если вы хотите использовать это для атрибута id, измените его следующим образом:

<span id="A">XXXX</span>

измените символ, который вы используете в функции выбора:

span = beautifulsoup.select('span#A')

Что мы узнали, так это то, что его грамматика похожа на CSS3