Информация о веб-создании может быть в 1 из 3 мест на странице, не знаю, как использовать оператор if для устранения нетиповых результатов

#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