#python #web-scraping #beautifulsoup #python-requests
Вопрос:
Следующий код-это очистка данных со страницы продукта amazon. С тех пор я обнаружил, что данные о цене могут быть в 1 из 3 мест в зависимости от типа продукта и того, как цена была добавлена на страницу. 2 других селектора CSS отсутствуют.
для веб url = f'https://www.amazon.co.uk/dp/B083PHB6XX'
— сайта, который я использую price = soup.find('span', {'id': 'priceblock_ourprice'}).text.strip()
Однако для веб-сайта url = f'https://www.amazon.co.uk/dp/B089SQHDMR'
мне нужно использовать price = soup.find('span', {'id':'priceblock_pospromoprice'}).text.strip()
Наконец, для веб url = f'https://www.amazon.co.uk/dp/B0813QVVSW'
-сайта, который мне нужно использовать price = soup.find('span', {'class':'a-size-base a-color-price'}).text.strip()
Я думаю, что решение для передачи этого для каждого URL-адреса, попробуйте найти priceblock_ourprice
, и если это не удастся, попробуйте найти priceblock_pospromoprice
, и если это не удастся, продолжайте поиск a-size base a-color-price
. Я не могу понять, как поместить это в оператор if, который не остановится, если элемент не найден.
Мой исходный код:
import requests from bs4 import BeautifulSoup import pandas as pd headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"} urls = [f'https://www.amazon.co.uk/dp/B083PHB6XX', f'https://www.amazon.co.uk/dp/B089SQHDMR', f'https://www.amazon.co.uk/dp/B0813QVVSW'] for url in urls: r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, 'lxml') name = soup.find('span', {'id': 'productTitle'}).text.strip() price = soup.find('span', {'id': 'priceblock_ourprice'}).text.strip() print(name) print(price)
Ответ №1:
Вы уже были на правильном пути со своими мыслями. Сначала проверьте наличие элемента в условиях, а затем установите значение для цены.
if soup.find('span', {'id': 'priceblock_ourprice'}): price = soup.find('span', {'id': 'priceblock_ourprice'}).text.strip() elif soup.find('span', {'id':'priceblock_pospromoprice'}): price = soup.find('span', {'id':'priceblock_pospromoprice'}).text.strip() elif soup.find('span', {'class':'a-size-base a-color-price'}): price = soup.find('span', {'class':'a-size-base a-color-price'}).text.strip() else: price = ''
Пример
import requests from bs4 import BeautifulSoup import pandas as pd headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"} urls = [f'https://www.amazon.co.uk/dp/B083PHB6XX', f'https://www.amazon.co.uk/dp/B089SQHDMR', f'https://www.amazon.co.uk/dp/B0813QVVSW'] for url in urls: r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, 'lxml') name = soup.find('span', {'id': 'productTitle'}).text.strip() if soup.find('span', {'id': 'priceblock_ourprice'}): price = soup.find('span', {'id': 'priceblock_ourprice'}).text.strip() elif soup.find('span', {'id':'priceblock_pospromoprice'}): price = soup.find('span', {'id':'priceblock_pospromoprice'}).text.strip() elif soup.find('span', {'class':'a-size-base a-color-price'}): price = soup.find('span', {'class':'a-size-base a-color-price'}).text.strip() else: price = '' print(name) print(price)
Выход
Boti 36475 Shark Hand Puppet Baby Shark with Sound Function and Speed Control, Approx. 27 x 21 x 14 cm, Soft Polyester, Battery Operated £19.50 LEGO 71376 Super Mario Thwomp Drop Expansion Set £34.99 LEGO 75286 Star Wars General Grievous’s Starfighter Set £86.99