Как я могу получить цену продукта с веб-сайта, используя Beautifulsoup?

#python #web-scraping #beautifulsoup #screen-scraping

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

Вопрос:

Я пытаюсь извлечь последнюю цену предложения для этого кроссовка из StockX, но я получаю сообщение об ошибке

 IndexError: list index out of range
  

sneaker_price по какой-то причине значение since становится пустым. Кто-нибудь может помочь?:

 from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://stockx.com/air-jordan-6-retro-travis-scott")

soup = BeautifulSoup(driver.page_source,"lxml")
driver.quit()

sneaker_price = soup.select("div.en-us stat-value stat-small")[0]
  

Комментарии:

1. Пожалуйста, поделитесь элементами HTML

Ответ №1:

Попробуйте CSS selector div.en-us.stat-value.stat-small :

 sneaker_price = soup.select("div.en-us.stat-value.stat-small")[0]
print(sneaker_price.text)
  

С принтами:

523
  

Примечание: Если вы получаете страницу с капчей, попробуйте указать больше HTTP-заголовков и / или файлов cookie. Например:

 import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0',
    'Accept-Language': 'en-US,en;q=0.5'
}

cookies = {
    'stockx_homepage': "sneakers",
}

soup = BeautifulSoup(requests.get("https://stockx.com/air-jordan-6-retro-travis-scott", headers=headers, cookies=cookies).content,"lxml")

sneaker_price = soup.select("div.en-us.stat-value.stat-small")[0]
print(sneaker_price.text)
  

Комментарии:

1. Я бы изменил значение с [0] на [1], чтобы обеспечить получение последнего значения. sneaker_price = soup.select("div.en-us.stat-value.stat-small")[1]

Ответ №2:

Вы можете использовать .ask div.en-us.stat-value.stat-small селектор, чтобы получить div, содержащий последнюю запрашиваемую цену. И поскольку существует более одного элемента, вы можете выбрать последний, например:

 ask_price = soup.select('.ask div.en-us.stat-value.stat-small')[-1]
print(ask_price.text) # $655