Как извлечь оригинальные цены с помощью BeautifulSoup? - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь изучить BeatifulSoup, но в настоящее время возникают проблемы с извлечением цен (особенно если есть скидка / скидка). Меня интересует только когда есть скидка (itemprop = "offer"), и для этого упражнения я просто хочу извлечь первоначальную цену.

Полная HTML может быть получена путем проверки этой страницы: https://www.patagonia.ca/shop/mens-hard-shell-jackets-vests

Выделенная нужная цель в HTML ниже:

targeted price

Я пытался

from bs4 import BeautifulSoup
import requests
import pandas as pd
import json

page = requests.get("https://www.patagonia.ca/shop/mens-hard-shell-jackets-vests", verify = False)
soup = BeautifulSoup(page.content, 'html.parser')

div_price = []

for section_tag in soup.find_all('div', class_='product-tile__meta-primary'):
    for div_prices in section_tag.find_all('div', class_='price'):
        if div_prices.get('itemprop') == 'offers':
            for x in div_prices.find_all('span', {'class':'strike-through list'}):        
                for y in x.find_all('span', class_='value'):
                    div_price.append(y.get('content'))
        else:
            continue

Приведенный выше код дает мне желаемые цены - мне нужна только первоначальная цена ($ 499), а , а не цена со скидкой ($ 349,30) - однако она повторяется несколько раз: (

[499,00, 435,00, 879,00, 999,00, 799,00, 499,00, 435,00, 879,00, 999,00, 799,00, 499,00, «435,00», «879,00», «999,00», «799,00», «499,00», «435,00», «879,00», «999,00», ...

Также я не горжусь с помощью вложенных циклов, я надеюсь, что сообщество может помочь исправить эти две ошибки (кажется, что я упускаю что-то простое здесь, но я просто не могу обдумать это):

  1. Если есть лучший способ без используя все циклы, я все уши
  2. Есть ли лучший способ извлечь необходимую информацию, кроме как продолжать использовать find_all (все еще в BeautifulSoup)?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Вы можете найти цену непосредственно по атрибуту itemprop на целевом интервале. Для куртки, где есть 2 цены, я использую метод find, поэтому требуется только первый найденный промежуток, поэтому цена без скидки

Вы можете сделать что-то вроде этого:

from bs4 import BeautifulSoup
import requests
import pandas as pd
import json

page = requests.get("https://www.patagonia.ca/shop/mens-hard-shell-jackets-vests")
soup = BeautifulSoup(page.content, 'html.parser')

div_price = []
# Loop on elements
for jacket in soup.find_all('div', {'class':'product-tile__content'}):
    span_price = jacket.find('span', {'itemprop': 'price'})
    if span_price:
        div_price.append(span_price.get('content'))
print(div_price)

РЕЗУЛЬТАТЫ:

['189', '189', '189', '189', '189', '189', '189', '189', '189', '189', '435', '499.00', '435.00', '189', '879.00', '249', '499', '999.00', '799.00', '249', '749', '499', '159', '879', '685', '499', '315', '625', '169', '625', '475', '435', '599', '375', '315', '625', '499', '315']
1 голос
/ 19 февраля 2020

Код:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.patagonia.ca/shop/mens-hard-shell-jackets-vests", verify = False)
soup = BeautifulSoup(page.content, 'html.parser')

div_price = []
for price in soup.find_all('span', {'class': 'strike-through list'}):
    div_price.append(str(price.text).strip()[3:])

print(div_price)

Выход:

['499', '435', '879', '999', '799']
1 голос
/ 19 февраля 2020
for price in soup.select('.price'):

    if price.select('.strike-through.list'):
        print(price.select('.strike-through.list'))
    else:
        print(price.select('.sales')) 

Этот код должен получить цену класса перечня зачеркнутых списков, если он доступен, в противном случае он получит исходную ставку класса продаж.

Должна сработать логика диапазона c на основе вашего кода.

Надеюсь, это поможет.

...