Forum: PC-Programmierung Python Beautifulsoup abschneiden


von Mark (Gast)


Lesenswert?

Hi,

ich versuche mich gerade an Beautifulsoup.

So ein bischen klappt das. Ein Ergebnis habe ich schon, allerdings 
möchte ich das Ergebnis jetzt "kürzen" und nur einen Teil davon 
verwenden um damit Rechnen zu können.
1
result1 = soup.find_all("li", {"class":["lvprice", "bold"]})
2
3
for result_back_one in result1:
4
    
5
   one = result_back.get_text().strip()
6
   print (one)

In der Printausgabe bekomme ich nun ein Ergebnis mit Zeilenumbruch.
1
EUR 10,61
2
(EUR 1,06/100 g)
Wie kann ich das jetzt so abschneiden, dass ich ausschließlich mit den 
daten arbeite die vor dem Zeilenumbruch sind?

Also ich möchte Quasi, dass ich nur mit
1
EUR 10,61
weiterarbeiten kann.

Oder eine Klasse zusätzlich komplett sperren kann
1
 <div class="ppu">(<b>EUR</b> 1,06/100 g)</div>

von Stefan (Gast)


Lesenswert?

Du solltest die zwei Teile deines Strings mithilfe von .split("\n") 
trennen können.
Oder noch besser, mit .splitlines()
Siehe auch folgendes in der Dokumentation:
https://docs.python.org/3.6/library/stdtypes.html#str.split

von Mark (Gast)


Lesenswert?

Ja, dass hatte ich so bereits versucht, dann nimmt er mir aber nur den 
Zeilenumbruch raus und die zweite Zeile ibleibt trotzdem erhalten.
1
result1 = soup.find_all("li", {"class":["lvprice", "bold"]})
2
3
for result_back_one in result1:
4
    
5
   one = result_back.get_text().strip().splitlines() #.split('\n') 
6
   print (one)
Ergebnis:
1
['EUR 10,61', '(EUR 1,06/kg)']

von Markus (Gast)


Lesenswert?

print one[0]
print one[1] ?

Ist bei BeautifulSoup immer etwas schwierig nachzuvollziehen, wenn man 
die zugrundeliegende Website nicht selbst zum Herumspielen parat hat.

von Mark (Gast)


Lesenswert?

Die Seite ist kein Großes Geheimnis.

Für eine Marktsudie, suchen wir Durchschnittspreise gewisser Artikel 
heraus.

Da geht es sowohl um Soforkauf als auch Gebotene Angebote als Vergleich.
Also 2 verschieden Abfragen. Die jeweils über einen neuen Link gestartet 
werden.

Hier ein Beispiellink:
http://www.ebay.de/sch/i.html?Menge=5%2520L&_sacat=179496&_nkw=Motor%C3%B6l%2010w40&_dcat=179496

Mich interessieren hier nur die Dick geschriebenen Preise.

Bei Angeboten mit Liter oder kg Angaben bekomme ich immer Fehler mit dem 
Zusammenrechnen, da kg nicht gefloatet werden kann.

von Markus (Gast)


Lesenswert?

Hast Du mal print one[1] ausprobiert?
Denn Dein Ergebnis
['EUR 10,61', '(EUR 1,06/kg)']
ist doch eine Liste oder nicht?

von Mark (Gast)


Lesenswert?

Ja, habe ich. Ich hatte das dummerweise an der falschen Stelle getestet.

Mir stellt sich jetzt allerdings die Frage, warum ich in dieser Variante 
kein replace mehr verwenden kann.



Anbei mal das ganze script
1
import os
2
import threading
3
import codecs
4
import time
5
import select
6
import csv
7
import traceback
8
from bs4 import BeautifulSoup 
9
from urllib.request import urlopen
10
import re
11
import requests
12
13
14
15
soupDE = BeautifulSoup (urlopen("http://www.ebay.de/sch/i.html?Menge=5%2520L&_sacat=179496&_nkw=Motor%C3%B6l%2010w40&_dcat=179496"), "html.parser")
16
17
18
result1_de = soupDE.find_all("li", {"class":["lvprice"]})
19
for result_back_one_de in result1_de:
20
    try:
21
       one_de = result_back_one_de.get_text().strip().splitlines() 
22
       #one_new_de = [one_de.replace('EUR','')]
23
       print (one_de[0])
24
    except Exception:
25
        print (sys.exc_info())
26
        pass
27
    
28
    
29
#if list_price_de:
30
 #   avg_list_price_de = sum * 1.0 / len(list_price_de)
31
  #  print (avg_list_price_de)

von Markus (Gast)


Lesenswert?

weil onede eine Liste ist, da könntest Du die Ersetzung zwar auf andere 
Weise durchführen, aber Du bist doch nur an einem Listenelement 
interessiert, dann sprich nur das an:
1
result1_de = soupDE.find_all("li", {"class":["lvprice"]})
2
for result_back_one_de in result1_de:
3
    try:
4
       one_de = result_back_one_de.get_text().strip().splitlines() 
5
       one_de_new = [one_de[0].replace('EUR','')]
6
       print (one_de_new)
7
....

von Tom (Gast)


Lesenswert?

Das habe ich den Ebay-mit-beautiful-soup-Abschnorchlern schon öfter 
geantwortet²: Ein paar Basics lernen ist sogar bei Python nötig:

str.splitlines(): Return a list of the lines in the string....
                           ^^^^

Hausaufgabe:
1) Eine list von strings selbst erzeugen.
2) Hat eine list eine Methode replace()?
3) Auf das erste oder zweite Element der list zugreifen.
4) In diesem Element irgendwas replacen.

Dieses Gestochere führt nicht weiter.





² oder ist das immer noch der gleiche?

von Markus (Gast)


Lesenswert?

Übrigens kann es einfacher sein auf die von Ebay bereitgestellten Api's 
zurückzugreifen als die Website zu scrapen. Speziell mit der Api von 
ebay habe ich allerdings keine Erfahrung.

https://developer.ebay.com/
www.linux-magazin.de/Ausgaben/2012/12/E-Commerce-APIs
https://github.com/eBayDeveloper/eBay_APICall_CodeSamples

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.