Seite 1 von 1

Die ersten beiden Matches ausgeben

Verfasst: Mittwoch 24. November 2021, 17:02
von Nitsuj
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

Re: Die ersten beiden Matches ausgeben

Verfasst: Mittwoch 24. November 2021, 17:47
von Sirius3
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.

Re: Die ersten beiden Matches ausgeben

Verfasst: Mittwoch 24. November 2021, 20:26
von Nitsuj
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

Re: Die ersten beiden Matches ausgeben

Verfasst: Mittwoch 24. November 2021, 22:01
von Sirius3
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()

Re: Die ersten beiden Matches ausgeben

Verfasst: Donnerstag 25. November 2021, 17:13
von Nitsuj
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

Re: Die ersten beiden Matches ausgeben

Verfasst: Donnerstag 25. November 2021, 17:20
von Sirius3
Oh, die Glaskugel zeigt gerade nur Nebel. Da wird wohl die Seite nicht die Daten so liefern, wie Du sie erwartest.