#python #web-scraping #beautifulsoup
Вопрос:
Итак, веб-сайт, который я использую, таков : https://keithgalli.github.io/web-scraping/webpage.html
и я хочу извлечь все ссылки в социальных сетях на веб-странице.
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://keithgalli.github.io/web-scraping/webpage.html')
soup = bs(r.content)
links = soup.find_all('a', {'class':'socials'})
actual_links = [link['href'] for link in links]
Я получаю ошибку, в частности:
KeyError: 'href'
Для другого примера и веб-страницы я смог использовать тот же код для извлечения ссылки на веб-страницу, но по какой-то причине на этот раз это не работает, и я не знаю, почему.
Я также попытался понять, в чем конкретно заключалась проблема, и, похоже, links
это вложенный массив, в котором links[0]
выводится все содержимое ul
тега, которое class=socials
, так сказать, не может быть повторено, так как первый элемент содержит все ссылки, а не каждый социальный li
тег должен быть отдельными элементами внутри links
Ответ №1:
Почему бы не попробовать что-нибудь вроде:
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://keithgalli.github.io/web-
scraping/webpage.html')
soup = bs(r.content)
links = soup.find_all('a', {'class':'socials'})
actual_links = [link['href'] for link in links if 'href' in link.keys()]
Получив от вас некоторую новую информацию и посетив веб-страницу, я понял, что вы совершили следующую ошибку:
Класс socials никогда не используется ни в одном элементе a, и поэтому вы не найдете ничего подобного в своем сценарии. Вместо этого вам следует искать li-элементы с классом «социальный».
Таким образом, ваш код должен выглядеть следующим образом:
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://keithgalli.github.io/web-
scraping/webpage.html')
soup = bs(r.content, "lxml")
link_list_items = soup.find_all('li', {'class':'social'})
links = [item.find('a').get('href') for item in link_list_items]
print(links)
Комментарии:
1. Ошибка типа: объект «Нетип» не может быть вызван
2. @GirthyLampost итак, есть ли у вас нетиповые объекты в списке, который вы повторяете? (ссылки)
3. Нет, я не должен, потому что я использовал метод find_all для получения вложенного контента, который содержит только ссылки на href, которые меня интересуют
4. @GirthyLampost вы использовали неправильные критерии поиска. Проверьте пост-обновление.
5. большое вам всем спасибо. это определенно была элементарная ошибка, так что это может показаться плохим вопросом, но это вызвало у меня огромное замешательство, так как я впервые пытаюсь изучить bs4 и веб-скребок. еще раз спасибо за ваше терпение.
Ответ №2:
Вот решение с использованием селекторов css:
import requests
from bs4 import BeautifulSoup as bs
r = requests.get('https://keithgalli.github.io/web-scraping/webpage.html')
soup = bs(r.content, 'lxml')
links = soup.select('ul.socials li a')
actual_links = [link['href'] for link in links]
print(actual_links)
Выход:
['https://www.instagram.com/keithgalli/', 'https://twitter.com/keithgalli', 'https://www.linkedin.com/in/keithgalli/', 'https://www.tiktok.com/@keithgalli']
Комментарии:
1. я даже попробовал метод css, где я использую soup.select («ul.socials a»), и это не сработало, но я не знал, что разница заключается в пути селектора, т. Е. «ул.социалы ли а»
2. В соответствии с селекторами css, сначала я выбираю тег ul(неупорядоченный список с именем класса, ставлю точку перед классом, затем следующее имя тега (li) с пробелом, затем следующий тег a с пробелом. Вы также пропустили синтаксический анализатор, чтобы вытащить dom, такой как xlml, html.parser . Здесь я использовал lxml . Спасибо