#python #web-scraping #beautifulsoup
#python #веб-очистка #beautifulsoup
Вопрос:
Я пытаюсь получить 100 URL-адресов со следующей страницы результатов поиска:
Вот тестовый код, который у меня есть:
import requests
from bs4 import BeautifulSoup
urls = []
def get_urls(url):
page = requests.get(url)
soup = BeautifulSoup(page.content,'html.parser')
s = soup.find('a', class_="header w-brk")
urls.append(s)
print(urls)
К сожалению, список возвращается [None]
. Я также пытался использовать href=True
метод soup.find
or soup.find_all
, но, к сожалению, это тоже не работает. Я вижу еще одну проблему с этим:
URL-адрес, который страница предоставляет в источнике, например: a href="/iad/kaufen-und-verkaufen/d/fahrrad-429985104/"
просто конец willhaben.at
URL-адреса. Когда я добавлю все эти URL-адреса в свой список, я не смогу очистить их так, как они есть, мне придется каким-то образом добавить к нему корневой URL-адрес, прежде чем мой scraper сможет его загрузить.
Какой наиболее эффективный способ я могу решить эту проблему?
Спасибо!
Комментарии:
1. Вы очищаете links (
<a>
) с помощью классаheader w-brk
. Однако элементы, которым назначены эти классы, являются<div>
s.soup.find('div', class_="header w-brk")
сохраняет ваш результат.2. Я вижу! Спасибо. Результатом этого является текст всего класса. Есть ли хороший способ извлечь только
href=
часть?3. если у вашей переменной есть имя
s
: это простоs.a['href']
илиs.a.get('href', default)
. Может быть, взгляните на документы4. Это работает! Но извлекается только один URL-адрес. Я пробовал
soup.find_all
, но получаю сообщение об ошибкеare you sure you're not meant to call find()
Ответ №1:
Вы можете выбрать множество способов получения привязанных URL-адресов.
суп.выберите элегантный способ:
urls.extend([a.attrs['href'] for a in soup.select('div.header.w-brk a')])
суп.выберите более простой способ:
for a in soup.select('div.header.w-brk a'):
urls.append(a.attrs['href'])
soup.find_all более простой способ:
for div in soup.find_all('div', class_="header w-brk"):
urls.append(div.find('a').attrs['href'])
soup.find_all элегантный способ:
urls.extend([div.find('a').attrs['href'] for div in soup.find_all('div', class_="header w-brk")])
Ответ №2:
Оформить покупку:
import requests
from bs4 import BeautifulSoup
urls = []
url = "https://www.willhaben.at/iad/kaufen-und-verkaufen/marktplatz/fahrraeder-radsport/fahrraeder-4552?rows=100amp;areaId=900"
def get_urls(url):
page = requests.get(url)
soup = BeautifulSoup(page.content,'html.parser')
s = soup.findAll("div", {"class": "w-brk"})
for link in s:
l = link.find("a")
urls.append("https://www.willhaben.at" l['href'])
print(urls)
get_urls(url)
Ответ №3:
Для второй части вашего вопроса вы могли бы использовать простое понимание списка:
urls_with_base = [f"{base_url}/{url}" for url in urls]
Ответ №4:
Это код, который вы ищете. Я надеюсь, что вам не нужны какие-либо объяснения для этого кода:
import requests
from bs4 import BeautifulSoup
urls = []
def get_urls(page_url):
global urls
page = requests.get(page_url)
soup = BeautifulSoup(page.content, "html.parser")
anchor_tags = soup.find_all("a", href=True)
urls = [anchor_tag.get("href") for anchor_tag in anchor_tags]