Ваша первая ошибка - передать имя атрибута find_all()
, который вместо этого интерпретирует первый аргумент как тэг .Затем вы просите find_all()
отфильтровать найденные теги, чтобы они возвращали только те, у которых атрибут a class
соответствует данному значению, теги не могут иметь имен атрибутов с пробелом.
Обратите внимание, что у вас нет тегов a class
, у вас есть теги a
с атрибутами class
и href
.Таким образом, вы хотите использовать
soup = BeautifulSoup(driver.page_source)
tags = soup.find_all('a', {'class': 'web-btn-link', 'href': True})
Фильтр 'href': True
соответствует только в том случае, если для тега определен этот атрибут.Обратите внимание, что я фильтрую только по одному из двух классов;см. Поиск по классу CSS почему это важно, но вы, как правило, не хотите исключать сопоставление тегов с более чем двумя найденными вами классами.В подавляющем большинстве документов обычно требуется сопоставить только один из классов (и easy-click
звучит как класс для скрипта или расширения CSS, применяемого к потенциально различным элементам на странице).
Этопоиск намного проще с помощью CSS .select()
call :
soup = BeautifulSoup(driver.page_source)
tags = soup.select("a.web-btn-link.easy-click[href]")
Это ищет a
теги с по крайней мере обоими web-btn-link
и easy-click
классы и только те, которые имеют атрибут href
.
Вызов все равно создаст последовательность объектов тегов, чтобы получить только атрибуты, используйте подписку:
soup = BeautifulSoup(driver.page_source)
tags = soup.select("a.web-btn-link[href]")
urls = [t['href'] for t in tags]
Или просто печатать их по очереди:
for tag in tags:
print(t[‘href’])