Html Knoten 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
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

Hallo zusammen

ich weiss nicht recht ob ich mit meiner Bezeichnung richtig bin. Aber nun zu meinem Problem ( bin noch ein wenig unerfahren mit python).

ich möchte eine Website aufrufen und aus deren Quellcode eine Information auslesen. Dabei möchte ich aber nur auf die Standard Klassen ( hoffe das ist vom Namen her das gleiche wie in Java) von Python zurückgreifen.

Hier soweit mein code:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import urllib
import xml.dom.minidom as dom
import re


str2='<span class="bold">'

f = urllib.urlopen("xxxxx")
a=0
for zeilen in f:
    if (zeilen.find(str2) == 0) and a<2:
        print re.split(r'<[span] [class="bold"]>(.*?)</[span]>',zeilen)
##        print re.split(r"<[span] [class]>(.*?)</[span]>",zeilen)
##        print zeilen
        a=a+1

f.close()

print "done"
Die Struktur ( Knoten) den ich auslesen möchte ist der folgende: <span class="bold">Hallo wie gehts 1212</span>
Den Wert ="Hallo wie gehts 1212" hätte ich gerne ausgegeben....
Nur irgendwie scheinen meine Abfragen nicht richtig zu sein.....

Über Lösungsvorschläge wäre ich dankbar + da ich nicht normalerweise hmtl auslese weiß ich auch nicht ob die herangehensweise so sinnvoll ist

Ps: könnt ihr mir einen guten Python Editor empfehlen? ich arbeite noch immer mit Pythonwin da meine programmierung für arcgis abläuft.... Aber der ist einfach grausam...:)


Bin für jedlichen Kommentar dankbar


Gruß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

with urllib.urlopen("xxxxx") as site:
    print re.findall(r'<span class="bold">(.*?)</span>', site.read())
Aber: Regular Expressions sind kein Werkzeug um mit HTML umzugehen (XML Parser ebensowenig).

Daneben solltest du dich in Regular Expressions einlesen "[span]" in einer regexp tut etwas ganz anderes als du wohl denkst.
BlackJack

@DerBorsti: Also wenn Du mit Standardklassen die Standardbibliothek meinst, dann geht das gar nicht, denn da ist nichts dabei mit dem man HTML wie es im in freier Wildbahn vorkommt vernünftig parsen kann. HTML ist kein XML. Nur auf XHMTL trifft das zu. Für XML kannst Du `xml.etree` aus der Standardbibliothek nehmen, und besser nicht den DOM-Kram, der ist hässlich und unpythonisch.

Für HTML nimmt man üblicherweise `lxml.html`. Ungetestet:

Code: Alles auswählen

from itertools import islice
from lxml import html


def main():
    document = html.parse('http:/.....')
    for span_node in islice(document.cssselect('span.bold'), 2):
        print span_node.text
    print 'done'


if __name__ == '__main__':
    main()
Anmerkungen zu Deinem Quelltext: Namen sollte beschreiben wofür der Wert dahinter steht, das geht mit einbuchstabigen Namen in der Regel nicht wirklich gut.

Ich vermute mal der Vergleich des Ergebnisses von `find()` mit 0 ist nicht wirklich das was Du da haben wolltest. Sonst machst Du an der Stelle *deutlich* mehr Annahmen über die Form des HTML-Quelltextes als man machen sollte. Falls es einfach nur um enthalten sein ging, das geht mit dem ``in``-Operator.

Statt `a` manuell mitzuzählen würde man die `enumerate()`-Funktion verwenden.

Dateien sollte man mit der ``with``-Anweisung schliessen lassen. Das ist sicherer, weil es unter *allen* Umständen gemacht wird, wenn der ``with``-Block verlassen wird.

Reguläre Ausdrücke sind keine gute Idee um HTML (oder auch XML) zu verarbeiten. Dazu sind die Formate zu komplex und zu viele Variationen können das gleiche Dokument beschreiben, die kann man aber nicht mit regulären Ausdrücken alle abdecken.
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

Oh wow

Danke für die Antworten

@cofi ->werde mich in Regular Expressions einlesen

@BlackJack
Sehr interessant ! - "unpythonisch" :P - lxml werde ich mir dann mal besorgen.
Ja ich meinte Standardbibs.

Mit

Code: Alles auswählen

[..]
str2='<span class="bold">'
[..]
if (zeilen.find(str2) == 0)

[..] 
wollte ich halt die Datenmenge halbieren... Ich weiß genau wo die Informationen stehen die ich gerne hätte...

Vielen dank für die Kommentare - ich werde das jetzt erstmal umsetzen und ggf. nochmal melden

vielen dank nochmals !
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun, `str.find() == 0` ist halt in dem Fall nur dann wahr, wenn es am Anfang der Zeile steht: http://docs.python.org/3/library/stdtypes.html#str.find

Damit machst du wahrscheinlich weit mehr als die Datenmenge nur zu halbieren ;)
DerBorsti
User
Beiträge: 18
Registriert: Freitag 30. März 2012, 13:44

cofi hat geschrieben:Nun, `str.find() == 0` ist halt in dem Fall nur dann wahr, wenn es am Anfang der Zeile steht: http://docs.python.org/3/library/stdtypes.html#str.find

Damit machst du wahrscheinlich weit mehr als die Datenmenge nur zu halbieren ;)

Acherje ....
Danke vielmals !
Antworten