Ich versuche, BeatifulSoup zu lernen, habe aber derzeit Probleme beim Extrahieren von Preisen (insbesondere, wenn es einen Rabatt / Durchschlag gibt). Ich bin nur interessiert, wenn es einen Rabatt gibt (itemprop = "Angebote") und für diese Übung möchte ich nur den ursprünglichen Preis extrahieren.

Vollständiges HTML erhalten Sie, indem Sie diese Seite überprüfen: https://www.patagonia.ca/shop/mens-hard- Shell-Jacken-Westen

Hervorgehobenes gewünschtes Ziel im HTML unten:

targeted price

Ich habe versucht

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

Der obige Code gibt mir die gewünschten Preise - ich möchte nur den ursprünglichen Preis (499 USD) und nicht den reduzierten Preis (349,30 USD) - er wird jedoch mehrmals wiederholt :(

['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 ',. . .

Ich bin auch nicht stolz auf die verschachtelten Schleifen, von denen ich hoffe, dass die Community helfen kann, diese beiden Fehler zu beheben (es scheint, als würde mir hier etwas Einfaches fehlen, aber ich kann es einfach nicht verstehen):

  1. Wenn es einen besseren Weg gibt, ohne alle Schleifen zu verwenden, bin ich ganz Ohr
  2. Gibt es eine bessere Möglichkeit, die erforderlichen Informationen zu extrahieren, als weiterhin find_all zu verwenden (immer noch in BeautifulSoup)?
1
umm 19 Feb. 2020 im 18:53

3 Antworten

Beste Antwort

Sie finden den Preis direkt über das attr itemprop in der Zielspanne. Für die Jacke, bei der es 2 Preise gibt, verwende ich die find -Methode, sodass nur die erste gefundene Spanne benötigt wird, also der Preis ohne Rabatt

Sie können so etwas tun:

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)

ERGEBNISSE:

['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']
2
Maaz 19 Feb. 2020 im 16:37

Code:

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)

Ausgabe:

['499', '435', '879', '999', '799']
1
Ali 19 Feb. 2020 im 16:49
for price in soup.select('.price'):

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

Mit diesem Code erhalten Sie den Preis für die Durchstreiklistenklasse, sofern verfügbar, andernfalls wird der ursprüngliche Preis für die Verkaufsklasse angegeben.

Die Span-Logik sollte basierend auf Ihrem Code funktionieren.

Hoffe das hilft.

1
NMAK 19 Feb. 2020 im 16:46