Seite 1 von 1

Html Knoten auslesen

Verfasst: Mittwoch 27. Februar 2013, 16:08
von DerBorsti
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ß

Re: Html Knoten auslesen

Verfasst: Mittwoch 27. Februar 2013, 16:24
von cofi

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.

Re: Html Knoten auslesen

Verfasst: Mittwoch 27. Februar 2013, 16:30
von 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.

Re: Html Knoten auslesen

Verfasst: Mittwoch 27. Februar 2013, 16:42
von DerBorsti
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 !

Re: Html Knoten auslesen

Verfasst: Mittwoch 27. Februar 2013, 17:22
von cofi
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 ;)

Re: Html Knoten auslesen

Verfasst: Donnerstag 28. Februar 2013, 15:14
von DerBorsti
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 !