Удаление всех URL-адресов со страницы результатов поиска BeautifulSoup

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

Я пытаюсь получить 100 URL-адресов со следующей страницы результатов поиска:

https://www.willhaben.at/iad/kaufen-und-verkaufen/marktplatz/fahrraeder-radsport/fahrraeder-4552?rows=100amp;areaId=900

Вот тестовый код, который у меня есть:

 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]