Scrapping CODE

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nexuz89
User
Beiträge: 18
Registriert: Montag 27. Juli 2020, 10:59

Hallo zusammen ich benötige mal wieder eure Hilfe :)



Ich möchte gerne ein web Shop scrappen leider kann ich dort nicht den preis und die Kategorie "bettbeine" scrappen, da ich nicht weis wie ich die Reverenzen erwisch.


mein momentaner code für den preis :

Code: Alles auswählen

Price=soup.find('span',class_='range-revamp-price__integer')
    if Price is not None:
        Price = Price.text.strip() 
    else:
        Price='N/A'
    print(Price)
mein momentaner Code für die Kategorie:

Code: Alles auswählen

Categories=soup.find_all('li',class_='bc-breadcrumb__list-item')
    if len(Categories) >4:
        # print(Categories[2].text.strip())
        Categories = Categories[0].text.strip()
    else:
        # print(Categories[-2].text.strip())
        Categories = Categories[-2].text.strip()
    print(url)

für diese Seite `https://www.ikea.com/ch/de/p/brennasen- ... 20299688/´.


vielen dank schon im vorraus !
ElektroBerry
User
Beiträge: 31
Registriert: Samstag 16. Mai 2020, 18:52

Dann versuche ich mal genau zu erklären wie ich die gesuchten Elemente finde.

Den Preis finden::

Ich öffne die Webseite mit Firefox (andere Browser können das auch). Drücke Strg+Shift+C. Die Entwicklerkonsole vom Browser öffnet sich. Nun wähle ich das gesuchte Element aus.
In der Quelltextbox sehe ich, dass der Preis aufgeteilt ist in Franken und Rappen. Alle gesuchten Preisinformationen sind in:

Code: Alles auswählen

<span class="range-revamp-price
Also speichere ich mir dies erst einmal:

Code: Alles auswählen

preis = doc.find("span", class_="range-revamp-price")

Der 1.Teil vom Betrag ist zu finden unter:

Code: Alles auswählen

<span class="range-revamp-price__integer">20</span>
Diesen Teil kann ich dann finden mit:

Code: Alles auswählen

preis.find("span", class_="range-revamp-price__integer").text
Der Betrag hinter dem Komma finde ich in diesem Teil:

Code: Alles auswählen

 <span class="range-revamp-price__separator">.</span>
      00
Das gesuchte ist erst nach dem Span zu finden, also finde ich es mit:

Code: Alles auswählen

preis.find("span", class_="range-revamp-price__separator").next_sibling
Die Anzahl des Artikel würde sich verstecken unter:

Code: Alles auswählen

<span class="range-revamp-price__unit">/ 4 Stück</span>
Und wie man den Preis nun zusammenfügt, sollte klar sein. Es ist aber besser diesen Betrag als Cent/Rappen zu speichern, damit man nicht mit Float-Beträge rechnen muss.


Die Artikel_Kategorie finden::

Browser öffnen und Element so auswählen, dass der komplette Produkt-Pfad gefunden wird.
Nun sehe ich, dass der Pfad komplett zu finden ist in:

Code: Alles auswählen

     <ol class="bc-breadcrumb__list" data-breadcrumb-links="">
Also speichere ich mir dies erstmal ab:

Code: Alles auswählen

 pfad_angaben = doc.find("ol", class_="bc-breadcrumb__list")
Nun möchte ich in dieser Html-Liste alle Elemente finden. Jedes Element hat als class_="bc-breadcrumb__list-item", also kann ich folgendes versuchen:

Code: Alles auswählen

for pfad in pfad_angaben.find_all("li", class_="bc-breadcrumb__list-item"):
    print(pfad.text.strip())
    
'''Ausgabe:
Produkte
Möbel
Betten
Bettbeine
BRENNÅSEN Bein'''
Ich hoffe die erklärung ist hilfreich und das vorgehen ist soweit nachvollziehbar.
nexuz89
User
Beiträge: 18
Registriert: Montag 27. Juli 2020, 10:59

Vielen dank

danke für deine Inputs, das Problem mit der Kategorie hat sich erledigt.

Bei dem preis hänge ich leicht

Mein code

Code: Alles auswählen

Price=soup.find('span',class_='range-revamp-price__integer')
    if Price is not None:
        Price = Price.text.strip() 
    
    Price1=soup.find('span',class_='range-revamp-price__separator')
    if Price1 is not None:
        Price1 = Price1.text.strip()
    
    Price2=soup.find('span',class_='range-revamp-price__separator')
    if Price2 is not None:
        Price3 = Price2.find('span')
        if Price3 is not None:
            Price3 = Price3.text.strip()
    else:
        Price='N/A'
    print(Price+Price1+Price3)
leider bekomme ich diesen fehler ausgespuckt.
-->TypeError: can only concatenate str (not "NoneType") to str

leider lassen sich alle drei werte nicht miteinander verbinden.
hast du evtl eine lösung dafür ?

lg
ElektroBerry
User
Beiträge: 31
Registriert: Samstag 16. Mai 2020, 18:52

Price3 ist bei dir None. Und den Punkt muss man doch nicht crawlen. Der ändert sich doch nie.

Code: Alles auswählen

Price2=soup.find('span',class_='range-revamp-price__separator')
if Price2 is not None:
    print("DEBUG", Price2)
    Price3 = Price2.find('span')
    print("DEBUG", Price3)
    if Price3 is not None:
        Price3 = Price3.text.strip()
else:
    Price='N/A'
print("DEBUG Price:", Price, "DEBUG Price1:", Price1, "DEBUG Price3:", Price3)
print(Price+Price1+Price3)

Ausgabe:
DEBUG <span class="range-revamp-price__separator">.</span>
DEBUG None
DEBUG Price: 49 DEBUG Price1: . DEBUG Price3: None
Wenn ich meine Lösung aus dem vorherigen Post zusammensetze sieht es so aus:

Code: Alles auswählen

preis = soup.find("span", class_="range-revamp-price")
franken = preis.find("span", class_="range-revamp-price__integer").text
rappen = preis.find("span", class_="range-revamp-price__separator").next_sibling
betrag = int(franken + rappen)
print(betrag)
nexuz89
User
Beiträge: 18
Registriert: Montag 27. Juli 2020, 10:59

vielen dank ich bekomme jetzt z.b 939 gecrawlt wie bekomme ich jetzt den punkt zwischen 9.39 ?
nexuz89
User
Beiträge: 18
Registriert: Montag 27. Juli 2020, 10:59

nexuz89 hat geschrieben: Samstag 19. September 2020, 18:29 vielen dank ich bekomme jetzt z.b 939 gecrawlt wie bekomme ich jetzt den punkt zwischen 9.39 ?
hat sich erledigt vielen dank nochmal für deine hilfe !
Antworten