Как выбрать элемент, основанный на явном совпадении в BeautifulSoup? - PullRequest
2 голосов
/ 22 октября 2019

Есть два элемента: <div class = "abc def"> и <div class = "abc">

Я хочу выбрать последний.

Мой код

soup.find('div', {'class':'abc'})

Однако он выбираетбывший.

Как правильно это сделать?

Ответы [ 4 ]

0 голосов
/ 22 октября 2019

Чтобы получить точное соответствие класса, вы можете использовать лямбда-выражение следующей функции в качестве фильтра.

 soup.find_all(lambda x: x.name == 'div' and ''.join(x.get('class', list())) == 'abc')

Вы также можете обернуть это в функцию, если хотите. ''.join(x.get('class', list())) == 'abc' присоединяет классы (если доступно) и проверяет, равно ли оно 'abc'.

Пример

from bs4 import BeautifulSoup
html = """
<div class = "abc def"></div>
<div class = "abc"></div>
<div></div>
"""
soup = BeautifulSoup(html, 'html.parser')
print(
    soup.find_all(
        lambda x: x.name == 'div' and ''.join(x.get('class', list())) == 'abc'
    )
)

Выход

[<div class="abc"></div>]

Ссылка:

0 голосов
/ 22 октября 2019

С Официальный документ :

Вы также можете найти точное строковое значение атрибута класса:

css_soup.find_all("p", class_="body strikeout")
# [<p class="body strikeout"></p>]
soup.find_all("div", class_="abc")
0 голосов
/ 22 октября 2019

Попробуйте :nth-of-type(2) или :nth-child(2) с селектором CSS.

print(soup.select_one('.abc:nth-of-type(2)'))

Пример :

html='''<div class = "abc def"></div>
        <div class = "abc"></div>'''

soup=BeautifulSoup(html,'html.parser')
print(soup.select_one('.abc:nth-of-type(2)'))

Отредактировано:

print(soup.select_one('.abc:not(.def)'))
0 голосов
/ 22 октября 2019

Предыдущий элемент имеет два класса: и (см., Например, Как назначить несколько классов для контейнера HTML? ), поэтому BeautifulSoup правильно указывает на него при использовании find().

Чтобы указать второй, вы должны использовать findAll - который возвращает список - и извлечь второй элемент:

soup.findAll('div', {'class':'abc'})[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...