Problem mit Url aus .txt 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
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

Hallo.
Ich beschäftige mich erst seit ein paar Wochen mit Python, habe also noch nicht soviel Ahnung.
Eigentlich google ich mir immer alles zusammen, aber an diesem Punkt komm ich einfach nicht weiter.
Ich möchte von einer Website bestimmte urls auslesen, diese in einer txt Datei speichern, und anschließen jede einzelne öffnen um einige Werte auszulesen.
Urls auslesen und speichern funktioniert.
Die Werte aus den einzelnen Seite auslesen auch, aber nur wenn ich die Adressen direkt eingebe, also nicht aus der txt Datei auslese.

Hier ist mein code, alles für die Frage "unwichtige" schmeiß ich mal raus, der übersichtlichbarkeit halber:

Code: Alles auswählen

sfile = open("urltest.txt")
slist = sfile.read()
newslist = slist.split("\n")
def t_s():
    i=0
    while i< len(newslist):
        index_url = newslist[i]
        htmlfile = urllib.urlopen(index_url)
        htmltext = htmlfile.read()
        doc = lxml.html.fromstring(htmltext)
        result = doc.xpath("//li[@class='price']")
        result2 = doc.xpath("//*|//text()")
        result3 = doc.xpath("//span[@class='titel']")
        for i in range(0,1):
            isbn = (lxml.html.tostring(result2[0]))
            sep = '</title>'
            .....
            isbn4 = isbn3.rsplit(' ',3)

            price = (lxml.html.tostring(result[0]))
            sep = '&'
            .....
            price3 = price2.rsplit(' ',2)

            title = (lxml.html.tostring(result3[0]))
            sep = '</span>'
            .....
            title5 = title4.replace('&#246;', 'oe')

            print isbn4[1]  ,title5 ,price3[2]
        i+=1
t_s()
Das Ergebnis ist:
Werte aus Url1
Werte aus Url2
Werte aus Url2
Werte aus Url2
...
Also die ersten beiden Ausgaben sind korrekt, und danach wird die zweite einfach nur ständig widerholt.
Hoffenlich kann mir hier jemand weiterhelfen :)
Zuletzt geändert von Anonymous am Freitag 20. Februar 2015, 22:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@ulli82: Schau mal wo Du überall `i` verwendest.

Warum ist die äussere Schleife eine ``while``-Schleife und warum das `i` dort? Du könntest dort mit einer ``for``-Schleife direkt über die Elemente von `newslist()` iterieren.

Namen sollte man nicht durchnummerieren und auch keine konkreten Datentypen in den Namen kodieren. Das wird an der ein oder anderen Stelle zu einem Problem wenn man den Typ mal ändert. Dann muss man die Namen überall anpassen oder hat falsche und irreführende Namen im Quelltext. `slist` ist zum Beispiel gar keine Liste. Und kryptische Abkürzungen und Prä- oder Postfixe sind auch keine gute Idee. Nicht nur das das `list` in `slist` falsch ist, es ist auch überhaupt nicht klar was dieses `s` bedeuten soll.

Dateien die man öffnet, sollte man auch wieder schliessen. Dafür eignet sich die ``with``-Anweisung um sicher zu stellen dass eine Datei beim verlassen des ``with``-Blocks auf jeden Fall geschlossen wird. `lxml.html.parse()` kann man direkt eine URL übergeben. Das hat zusätzlich den Vorteil dass der Parser auch Zugriff auf die Header-Daten vom Server erlangen kann, zum Beispiel wenn dort eine Zeichensatzkodierung angegeben ist.

Funktionen sollten nicht einfach so auf Werte ausser Konstanten zugreifen die nicht als Argument übergeben wurden. Damit schafft man sich unübersichtliche Abhängigkeiten und Funktionen lassen sich so sehr schlecht isoliert testen oder wiederverwenden. Das Problem löst sich von selbst wenn man auf Modulebene nur Code stehen hat der Konstanten, Funktionen, und Klassen definiert und alles andere in Funktionen verschwinden lässt.

Die Verwendung von `lxml.html.tostring()` lässt böses ahnen wenn man so Sachen wie ``sep = '</span>'`` oder ``title4.replace('&#246;', 'oe')`` sieht. Man verarbeitet HTML und HTML-Fragmente nicht als wären es einfach nur Zeichenketten und schon gar nicht wenn man schon einen HTML-Parser am Start hat der Auszeichnung und Inhalt *vernünftig* und *sauber* trennen kann und echten Text, also Unicode-Objekte, liefert. Wenn ich mir die XPath-Ausdrücke anschaue die Du auf das gesamte Dokument loslässt, werden ich auch den Verdacht nicht los das Du die hierachische Struktur eines HTML-Dokuments auch gar nicht ausnutzt.
ulli82
User
Beiträge: 8
Registriert: Freitag 20. Februar 2015, 21:32

Vielen Dank für deine Antwort.

Du hattest Recht, das Problem war das `i`. Jetzt läuft (erstmal) alles.

Wie gesagt, ich beschäftige mich noch nicht lange mit Python. Alles zu erlernen ist leider ja nicht von heute auf morgen getan. Ich bin froh wenn ich erstmal was zustande kriege was so funktioniert wie ich es mir vorstelle. Ändern / verbessern / optimieren ... kann ich es ja anschließend immer noch.
Da jetzt ja alles läuft, ist auch schon die anschließend Zeit gekommen :P
ICh werde dann mal versuchen deine Tipps umzusetzen.
Antworten