Mehrzeiligen String (=Arrayelement) zeilenweise Auslesen

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
itmustgoon787
User
Beiträge: 2
Registriert: Freitag 14. Januar 2011, 22:05

Hallo,
ich habe ein kleines Script.

Ich wundere mich wieso bei diesem jeweils nur ein Zeichen pro Zeile ausgegeben wird.
Für mich ist es relevant, den Quellcode jeder einzelnen Webseite zeilenweise in einem String zu erhalten (für weitere Anweisungen mittels patterns).

Einen Zähler in der Art von "codeeinerseite = webseitenquellcodes" möchte ich vermeiden (hoffe das Python "interessantere" Lösungsansätze bietet).

Code: Alles auswählen

import urllib           
                                                                          
urls =  'http://google.de', 'http://web.de'
webseitenquellcodes = []

i = 0
while i < len(urls):
   webseitenquellcodes.append(urllib.urlopen(urls[i]).read())
   i = i+1


for codeeinerseite in webseitenquellcodes:
   for zeile in codeeinerseite:
      print zeile

Woran liegt es, dass ich nur ein Zeichen pro Zeile ausgegeben bekomme?
Wie kann ich das Problem lösen, ohne wie oben genannt einen Zähler zu benötigen?

Ich danke euch!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

.read() gibt den gesamten Inhalt als bytes zurück. Allerdings bin ich mir ziemlich sicher dass was immer du vorhast eine ganz schlechte Idee ist und wenn du mit patterns regexes meinst wird es schon schwierig schlechtere Lösungen zu finden für dein eigentliches Problem.

Schau dir mal lxml.html an, da wird sich auch um das dekodieren usw. gekümmert.
itmustgoon787
User
Beiträge: 2
Registriert: Freitag 14. Januar 2011, 22:05

ja, damit habe ich RegEx gemeint. Es ist eine schlechte Lösung - Tatsache - jedoch hat sich die Struktur der zu überwachenden Seite in den letzten zwei Jahren nicht geändert, sodass ich ohne weitere Anpassungen der RegEx an meine Informationen gelangen konnte. Da ich nun mit Python eine neue Sprache lerne bin ich aber motiviert "clevere" Wege zu gehen. Daher habe ich mein Script mittels der lxml.html verbessert (Danke für den gezielten Hinweis).

Ich möchte nun auch über den genauen Zweck berichten: Es geht darum auf einer Seite von "clever-tanken" den Benzinpreis einer bestimmten Tankstelle zu erhalten. Die "Zieltankstelle" wird anhand der URL angegeben. Auf der Seite, dessen Quellcode vom Script ausgewertet wird, erhält man in einer Tabelle Daten zu Name, Adresse, Öffnungszeiten und den Literpreisen der jeweiligen Tankstelle.

In meinem Script frage ich die Preise für Super-Benzin ab - hierzu nutzte ich die Tatsache, dass der Literpreis in der Liste 'tabellenelemte" auf das Suchwort "Super:" folgt. Es funktioniert soweit.

Gibt es dennoch eine bessere Möglichkeit um vom Suchwort "Super:" auf den Preis schließen zu können? In DOM gibt es doch auch parent, child, ...? Leider komme ich durch die Dokumentation und herumprobieren auf keine bessere Lösung.

Code: Alles auswählen

from lxml import etree
from StringIO import StringIO
import urllib

url = 'http://www.clever-tanken.de/showtank_payed.asp?Tankstelle=SUPOL+Regensburger+Str%2E+290+N%FCrnberg&secureid=15001&typ=Super&ort=904'
html_quellcode = urllib.urlopen(url).read()

parser = etree.HTMLParser()
tree = etree.parse(StringIO(html_quellcode), parser)
tabellenelemente = tree.xpath('//table//tr//td//text()')

i=0
while i < len(tabellenelemente):
   if tabellenelemente[i] == "Super:":
      print "Kraftstoff: " + tabellenelemente[i] + "Literpreis: " + tabellenelemente[i+2]
   i=i+1
Ausgabe: "Kraftstoff: Super: / Literpreis: 1,469"
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du solltest dich eventuell mal mit Firebug vertraut machen. Damit kannst du dir einfach den CSS/XPath Selektor eines beliebigen Elements anzeigen lassen.
Antworten