Beautiful Soup, как проверить наличие любого из нескольких атрибутов с помощью find_all? - PullRequest
2 голосов
/ 21 апреля 2020

Я хочу найти все теги "a", которые имеют атрибуты "href" и / или "data-href".

В настоящее время я делаю что-то вроде этого:

soup.find_all("a", href=True) + soup.find_all("a", {"data-href": True})

Есть ли более эффективный способ сделать это в одном find_all? Спасибо

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Если у вас BS4 4.7.1 или выше, вы можете использовать следующее css selector.

for item in soup.select('a[href],a[data-href],a[href][data-href]'):
    print(item)

Давайте рассмотрим этот пример.

data='''<a href="/pqr/abc" > Hello</a>
<a data-href="/xyz/abc" >World </a>
<a href="/hello/abc" data-href="/world/abc" > Hello World </a>'''

soup=BeautifulSoup(data,"html.parser")

for item in soup.select('a[href],a[data-href],a[href][data-href]'):
    print(item)

Вывод :

<a href="/pqr/abc"> Hello</a>
<a data-href="/xyz/abc">World </a>
<a data-href="/world/abc" href="/hello/abc"> Hello World </a>
0 голосов
/ 21 апреля 2020

В BeautifulSoup 4.7.1 могут использоваться следующие селекторы CSS: a[href], a[data-href] и a[href][data-href]. Используйте тот же код, что и код @ KunduK, как он указал. Если вы используете версии старше 4.7.1, вы должны сделать код:

soup.find_all("a", href=True) + soup.find_all("a", {"data-href": True})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...