Beautiful Soup не может извлекать ссылки

Я пытаюсь извлечь ссылки этой веб-страницы: https://search.cisco.com/search?query=iot

Используя этот код, я ничего не возвращаю:

# Get Html Data from webpage
html = urllib.request.urlopen(url, context=ctx).read()
soup = BeautifulSoup(html, 'html5lib')
# Retrieve all of the anchor tags    
tags = soup('a') for tag in tags:
    print(tag.get('href'))

Я пробовал метод find_all(), но у меня была та же проблема.

Пожалуйста, предоставьте вывод, который вы получаете.

ottovon 22.05.2019 17:11

Есть ли причина для формата вашего оператора цикла. Мне это кажется странным.

ottovon 22.05.2019 17:15

@ottovon Я ничего не получаю взамен. Оператор цикла в порядке. Я просто не очень хорошо справился с stackoverflow

Tobi 22.05.2019 17:49
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Введение в технологический стек Twitch
Введение в технологический стек Twitch
В этой статье мы подробно рассмотрим стек Twitch, который подразделяется на следующий набор технологий:
8 полезных HTML-тегов, которые лучше использовать вместо <div>
8 полезных HTML-тегов, которые лучше использовать вместо <div>
Когда я только начинал изучать html, я использовал div для всего, это был один из первых тегов, которые я выучил, и казалось, что он работает в любой...
HTML5: API локального хранилища (Local Storage)
HTML5: API локального хранилища (Local Storage)
LocalStorage - это простой способ хранения данных в браузере пользователя.
Доступность HTML - программирование с инклюзивной перспективой
Доступность HTML - программирование с инклюзивной перспективой
Представьте, что вы хотите поехать на пляж. Представьте, что вы упорно трудились весь год и заслужили это. Прибыв на место, вы обнаруживаете, что...
1
3
367
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте следовать шаблону, указанному в документация:

for link in soup.find_all('a'):
    print(link.get('href'))

Похоже на рендеринг java-скрипта на страницы. Вы можете использовать селен и красивый суп для получения ссылок.

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.get("https://search.cisco.com/search?query=iot&locale=enUS")
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()

for a in soup.find_all('a', href=True):
    print(a['href'])

Выход:

https://onesearch.cloudapps.cisco.com/searchpage?queryFilter=iot
/login?query=iot&locale=enUS
/login?query=iot&locale=enUS
https://secure.opinionlab.com/ccc01/o.asp?id=pGuoWfLm&static=1&custom_var=undefined%7CS%7CenUS%7Ciot%7Cundefined%7CNA
https://www.cisco.com/c/en/us/support/index.html
//www.cisco.com/en/US/support/tsd_most_requested_tools.html
https://apps.cisco.com/WOC/WOConfigUI/pages/configset/configset.jsp?flow=nextgen&createNewConfigSet=Y
http://www.cisco-servicefinder.com/ServiceFinder.aspx
http://www.cisco-servicefinder.com/WarrantyFinder.aspx
//www.cisco.com/web/siteassets/sitemap/index.html    
https://www.cisco.com/c/dam/en/us/products/collateral/se/internet-of-things/at-a-glance-c45-731471.pdf?dtid=osscdc000283
https://www.cisco.com/c/en/us/solutions/internet-of-things/overview.html?dtid=osscdc000283
https://www.cisco.com/c/en/us/solutions/internet-of-things/iot-kinetic.html?dtid=osscdc000283
https://www.cisco.com/c/m/en_us/solutions/internet-of-things/iot-system.html?dtid=osscdc000283
https://learningnetworkstore.cisco.com/internet-of-things?dtid=osscdc000283
https://connectedfutures.cisco.com/tag/internet-of-things/?dtid=osscdc000283
https://blogs.cisco.com/internet-of-things?dtid=osscdc000283
https://learningnetwork.cisco.com/community/internet_of_things?dtid=osscdc000283
https://learningnetwork.cisco.com/community/learning_center/training-catalog/internet-of-things?dtid=osscdc000283
https://blogs.cisco.com/digital/internet-of-things-at-mwc?dtid=osscdc000283
https://cwr.cisco.com/
https://engage2demand.cisco.com/LP=4213?dtid=osscdc000283
https://engage2demand.cisco.com/LP=15823?dtid=osscdc000283
https://video.cisco.com/detail/video/4121788948001/internet-of-things:-empowering-the-enterprise?dtid=osscdc000283
https://video.cisco.com/detail/video/4121788948001/internet-of-things:-empowering-the-enterprise?dtid=osscdc000283
https://video.cisco.com/detail/video/3740968721001/protecting-the-internet-of-things?dtid=osscdc000283
https://video.cisco.com/detail/video/3740968721001/protecting-the-internet-of-things?dtid=osscdc000283
https://video.cisco.com/detail/video/4657296333001/the-internet-of-things:-the-vision-and-new-directions-ahead?dtid=osscdc000283
https://video.cisco.com/detail/video/4657296333001/the-internet-of-things:-the-vision-and-new-directions-ahead?dtid=osscdc000283
/search/videos?locale=enUS&query=iot
/search/videos?locale=enUS&query=iot
https://secure.opinionlab.com/ccc01/o.asp?id=pGuoWfLm&static=1&custom_var=undefined%7CS%7CenUS%7Ciot%7Cundefined%7CNA
Ответ принят как подходящий

Вам не нужен селен. Лучше использовать запросы. На странице используется API, поэтому запрос от этого

import requests

body = {"query":"iot","startIndex":0,"count":10,"searchType":"CISCO","tabName":"Cisco","debugScoreExplain":"false","facets":[],"localeStr":"enUS","advSearchFields":{"allwords":"","phrase":"","words":"","noOfWords":"","occurAt":""},"sortType":"RELEVANCY","isAdvanced":"false","dynamicRelevancyId":"","accessLevel":"","breakpoint":"XS","searchProfile":"","ui":"one","searchCat":"","searchMode":"text","callId":"j5JwndwQZZ","requestId":1558540148392,"bizCtxt":"","qnaTopic":[],"appName":"CDCSearhFE","social":"false"}
r = requests.post('https://search.cisco.com/api/search', json = body).json()

for item in r['items']:
    print(item['url'])

Измените параметры, чтобы получить больше результатов и т. д.

Я еще не полностью понимаю код, но он работает. Спасибо!

Tobi 22.05.2019 18:15

API должен быть вашим первым выбором для этого. Они специально там, чтобы служить вам этот контент. В основном вы отправляете свой запрос в теле "query":"iot" . Чтобы получить результаты пакетами, вы указываете startIndex, а затем количество результатов, которые нужно вернуть, в качестве аргумента count.

QHarr 22.05.2019 18:16

Я подозреваю, что в документации по API указано максимальное количество результатов и т. д. Если не поиграть, чтобы найти это. Затем вы можете обновить тело в цикле, чтобы получить все результаты.

QHarr 22.05.2019 18:17

Хорошо большое спасибо. Я обязательно покопаюсь в этом. Действительно ли возможно очистить все ~ 90 000 результатов поиска, не используя, например, «Всплеск» или «Селен»? Как вы, возможно, уже заметили, есть кнопка «Загрузить еще» для динамической загрузки большего количества результатов поиска.

Tobi 22.05.2019 18:25

Я бы так подумал. Узнайте, каков лимит запросов в день и максимальные результаты по запросу. API предназначен специально для этого поискового запроса.

QHarr 22.05.2019 18:26

Другие вопросы по теме