BeautifulSoup возвращает пустой список с допустимым содержимым html

#python #web-scraping #beautifulsoup

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

Вопрос:

Я пытаюсь создать webscraper для венгерского сайта электронной коммерции под названием https://www.arukereso.hu .

 from bs4 import BeautifulSoup as soup
import requests

#The starting values
#url = input("Illeszd ide egy Árukeresős keresésnek a linkjét: ")
url = 'https://www.arukereso.hu/notebook-c3100/'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}
page_num = 1
allproducts = []

#Defining functions for better readability
def nextpage():
    further_pages = usefulsoup.find("div", class_="pagination hidden-xs")
    nextpage_num = page_num   1
    try:
        next_page = further_pages.find("a", string=str(nextpage_num))
        next_page = next_page['href']
        return next_page
    except:
        return None

while True:
    if url == None:
        break
    r = requests.get(url, headers=headers)
    page_html = r.content
    r.close()

    soup = soup(page_html, "html.parser")
    #print(soup)
    usefulsoup = soup.find("div", id="product-list")
    #print(usefulsoup)

    products = usefulsoup.find_all("div", class_="product-box-container clearfix")
    print(products)
    for product in products:
        allproducts.append(product)

    url = nextpage()

print(allproducts)
  

Проблема в том, что при первом nextpage() вызове функции она возвращает допустимую ссылку (https://www.arukereso.hu/notebook-c3100/?start=25 ), содержимое запроса также является допустимым html, но BeautifulSoup создает из него пустой список, поэтому программа завершается с ошибкой.

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

Ответ №1:

Проблема в вашем коде заключается в следующей строке:

 soup = soup(page_html, "html.parser")
  

При первом запуске цикла он работает, потому soup что имя еще не перезаписано. При следующем запуске метод soup из package перезаписывается, и именно поэтому у вас проблема. Переименуйте эту переменную, и она должна работать. Я его протестировал.

Ответ №2:

Я не уверен, почему это происходит, но scrapy может быть хорошим решением для решения такого рода проблем https://scrapy.org /