Die ersten beiden Matches ausgeben

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
Nitsuj
User
Beiträge: 3
Registriert: Mittwoch 24. November 2021, 16:56

Hallo zusammen,

ich arbeite aktuell an einem Web Scraper der mir ein paar Daten einbringen soll -> bin absoluter Python anfänger.
Ich habe es mittlerweile geschafft mir die wichtigen Informationen mit re rauszupicken, allerdings sind es noch zu viele Zahlen!
Ich habe folgenden Code:

# Die Preise in die XLSX Spalte C schreiben
i = int(1)
for price in prizes_html:
i += 1
Cell = "C"+str(i)
CellContent = re.findall('[0-9]+', price.text)
worksheet.write(Cell, str(CellContent))
print(Cell, CellContent)

Ziel ist es, die Preise von bestimmten Produkten mit xlsxwriter und beautifulsoup in eine Exceltabelle zu schreiben.
Folgenden Output habe ich:

C2 ['5', '39', '4', '95', '25', '00', '10', '34']
C3 ['5', '40', '3', '95', '69', '00', '9', '35']
C4 ['5', '40', '3', '99', '9', '39', '10', '00']
C5 ['5', '41', '3', '50', '10', '00', '8', '91']
C6 ['5', '65', '4', '05', '60', '00', '9', '70', '2']
C7 ['5', '80', '3', '95', '40', '00', '9', '75']
C8 ['5', '89', '2', '95', '19', '00', '8', '84']
C9 ['5', '89', '3', '95', '39', '50', '9', '84']

Soweit so gut! Allerdings benötige ich nur die ersten beiden Ergebnisse. Die restlichen Zahlen sind irrelevant.
Also benötige ich in diesem Fall:

C2 5,39
C3 5,40
C4 5,40

Ehrlich gesagt scheitere ich an dieser Aufgabe... Kann mir einer weiterhelfen?
Und wenn mir jemand noch sagen kann, wie ich die Brackets wegbekomme, wäre ich ebenfalls sehr dankbar :)

Viele Grüße
Justin
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

1 ist bereits ein int, das nochmal in eines umzuwandeln ist unsinnig. Wenn man aber einen Zähler in einer Schleife braucht, dann nimmt man enumerate.
Mit so einem regulären Ausdruck auf einen Text loszugehen, in dem es scheinbar mehrere Kommazahlen gibt, ist falsch. Wie sieht denn die Seite aus, damit wir einen besseren finden können.
Du willst keinen Text in Zellen scheiben, vor allem nicht die Stringrepräsentation einer Liste, sondern Zahlen. Dazu mußt Du erst die Eingabe in eine Zahl umwandeln.
Nitsuj
User
Beiträge: 3
Registriert: Mittwoch 24. November 2021, 16:56

Enumerate kannte ich vorher nicht, dass ändere ich um (y).
Die Seite(n) welche ich betrachten möchte sind: https://www.medizinfuchs.de/preisvergle ... 48585.html
Mit BeautifulSoup habe ich den HTML Code geparsed und dann mit html_findall('div', 'class_='price') die Preise selektiert.
Sobald ich zuhause bin, schicke ich gerne mal meinen ganzen Code. LG
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich kann nicht nachvollziehen, dass es jeweils mehr als einen Preis gibt:

Code: Alles auswählen

import requests
import bs4

URL = 'https://www.medizinfuchs.de/preisvergleich/pollival-1mg-ml-nasenspray-loesung-10-ml-ursapharm-arzneimittel-gmbh-pzn-13748585.html'

def main():
    response = requests.get(URL)
    response.raise_for_status()
    html = bs4.BeautifulSoup(response.content)
    for price in html.select('li.apotheke div.price'):
        print(float(price.text.strip(' \t\n€').replace(',', '.')))

if __name__ == "__main__":
    main()
Nitsuj
User
Beiträge: 3
Registriert: Mittwoch 24. November 2021, 16:56

Hallo Sirius3,

vielen Dank für die Hilfreiche Antwort, jetzt bekomme ich genau die Zahlen die ich brauche!
Allerdings ist der Output sehr inkonsistent... Mal bekomme ich Zahlen, mal nicht. Woran kann das liegen?

LG
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Oh, die Glaskugel zeigt gerade nur Nebel. Da wird wohl die Seite nicht die Daten so liefern, wie Du sie erwartest.
Antworten