#python-3.x #web-scraping
#python-3.x #очистка веб-страниц
Вопрос:
Я закодировал (очень простой) веб-скребок для очистки продуктов с веб-сайта sam’s club, а затем распечатал название продукта и цену продукта.
проблема в том, что python выводит одну и ту же цену (цену первого продукта на странице) для каждого другого элемента (даже если название меняется соответствующим образом).
если я изменяю страницу для очистки, цена изменяется на первую цену на этой странице, а затем помечается как цена для каждого отдельного элемента.
Я не понимаю, почему все остальное работает, а не цена продукта?
(примечание: переменная цены выглядит неэлегантно и сбивает с толку, потому что sam’s clube разбивает их цену на 3 поля на стороне сервера. цена = $, цена 2 = доллары, цена 3 = центы)
Спасибо за вашу помощь, код приведен ниже:
import requests, bs4
from bs4 import BeautifulSoup
#makes each request look like a human request
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Cookie': 'localeEditionShown_en=true; permutive-session=^%^7B^%^22session_id^%^22^%^3A^%^22e5386dfb-c58a-4882-b0e1-2cc2d9518982^%^22^%^2C^%^22last_updated^%^22^%^3A^%^222017-11-22T19^%^3A10^%^3A04.522Z^%^22^%^7D; visid_incap_774904=4xMirl1lRNOgrnN Sm9S1zNx61kAAAAAREIPAAAAAACAsmaAAbBYMBjQTCqLf/D6wOVO4hdnKjIF; incap_ses_151_774904=/LX SNRqsR8SzJi7p3YYAjKgGloAAAAApdQygw8VYBxbv/wvl7Be7A==; _gat=1; _gat_subdomainTracker=1; _ga=GA1.2.1522498341.1508602188; _gid=GA1.2.1243543827.1511694421'
}
#defines url and requests/beautifulsoup variables
url = "https://www.samsclub.com/s/gatorade"
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, 'lxml')
productlist = soup.find_all('div',class_='sc-pc-title-medium')
for products in productlist:
name = soup.find('div',class_='sc-pc-title-medium').text.strip()
price = soup.find('span', class_='Price-currency').text.strip()
price2 = soup.find('span', class_='Price-characteristic').text.strip()
price3 = soup.find('span', class_='Price-mantissa').text.strip()
productprice = price price2 '.' price3 #need to find out why its not updating
results = {
'product name': products.text.strip(),
'product price': productprice
}
print(results)
Ответ №1:
Я бы подошел к этому по-другому.
Возьмите все названия продуктов и все span
теги класса Price-group
, а затем соедините их вместе.
Вот как:
import itertools
import requests
from bs4 import BeautifulSoup
page = requests.get("https://www.samsclub.com/s/gatorade")
soup = BeautifulSoup(page.content, 'lxml')
product_names = [
p.getText(strip=True) for p
in soup.find_all("div", class_="sc-pc-title-medium")
]
product_prices = [
p["title"].split()[-1] for p in soup.find_all("span", class_="Price-group")
]
results = {
k: v for k, v
in itertools.zip_longest(product_names, product_prices, fillvalue="N/A")
}
for product, price in results.items():
print(product, price)
Вывод:
Gatorade Frost Variety Pack (20oz / 24pk) $14.98
Gatorade Sports Drinks Core Variety Pack (12oz / 28pk) $12.78
Gatorade Sports Drinks Liberty Variety Pack (20 oz., 24 pk.) $14.98
Gatorade Zero Variety Pack (12oz / 28pk) $12.78
Gatorade Berry Variety Pack (12 oz., 28 pk.) $12.78
Gatorade Thirst Quencher Powder, Frost Glacier Freeze (76 oz.) $9.98
Gatorade Zero Thirst Quencher Variety Pack (20 oz., 24 pk.) $14.98
Gatorade Powder Lemon-Lime (76.5oz) $9.98
Gatorade Squeeze Bottles (32oz / 3pk) $14.99
Gatorade Medium Classic Cooler (3Gal) $29.98
Selectivend CB500 Gatorade 10 Selection Drink Machine $4,638.00
Gatorade Liberty Variety Pack (12oz / 28pk) $12.78
Gatorade Fierce Variety Pack (20oz / 24pk) $12.98
Gatorade Frost Variety Pack (12oz / 28pk) $12.78
BOLT24 Fueled by Gatorade Variety Pack (16.9oz /15pk) $12.98
Gatorade Fruit Punch (20oz / 24pk) $14.98
Gatorade Lemon-Lime (20 oz., 24 pk.) $14.98
Gatorade Cool Blue (20 oz., 24 pk.) $14.98
Gatorade Orange (20 oz., 24 pk.) $14.98
Gatorade Frost Arctic Blitz (12 fl. oz, 28 pk.) $10.48
Propel Immune Support Zero Sugar Variety Pack (16.9 fl. oz., 24 pk.) $12.98
Gatorade G2 Variety Pack (20oz / 24pk) $12.98
Gatorade Variety Pack (24 oz., 12 pk.) $12.25
Gatorade Cool Blue (32 oz., 12pk.) $12.98
Gatorade Classic Variety Pack (32 oz., 12 pk.) $12.25
Gatorade Orange (32 oz., 12 pk.) $12.25
Gatorade Lemon-Lime (32 oz., 12 pk.) $12.13
Gatorade Fruit Punch (32 oz., 12 pk.) $10.98
Gatorade Fierce Fruit Punch Berry Thirst Quencher (12oz / 28pk) $10.98
Gatorade Fierce Blue Cherry Thirst Quencher (12oz / 28pk) $10.98
Gatorade Orange Thirst Quencher (12oz / 28pk) $10.98
Gatorade Zero Glacier Freeze Thirst Quencher (12oz / 28pk) $12.25
Gatorade Power Variety Pack (20.83oz / 24pk) $5,748.00
Gatorade Frost Glacier Freeze (32oz / 12pk) N/A
Gatorade All Star Club Variety Pack (24pk/11.83oz) N/A
Gatorade Fruit Punch (20.83oz / 24pk) N/A
Selectivend WS3000/CB300 Gatorade Combo Vending Machine N/A
Комментарии:
1. Потрясающе, я думал о чем-то похожем, но я не знал, как выразить это в логических терминах. Большое вам спасибо за вашу помощь!