[Python-de] HTML parsen, ü nach ü

"Martin v. Löwis" martin at v.loewis.de
Fre Dez 10 09:28:13 CET 2004


David Wojak wrote:
> Konkret: Man nehme HTML-Seite, parst sich gewisse Daten (bsp: Newspage wie
> www.heise.de) und generiert daraus eine XML Datei.
> 
> Wie geh ich das an?
> 
> Bin noch relativ neu in Python, also bitte ned bös sein, wenn die Frage Müll
> ist, allerdings hab ich hier ein Problem mit den Encodings... (ü ->
> &#123)

Zunächst mal solltest Du verstehen, was ü bedeutet. Das ist in der
HTML-DTD erklärt:

http://www.w3.org/TR/html4/sgml/entities.html

Dort findest Du

<!ENTITY uuml   CDATA "&#252;" -- latin small letter u with diaeresis,
                                   U+00FC ISOlat1 -->

Das heißt, &uuml; ist dasselbe wie &#252.

Zum Parsen von HTMl gibt es mehrere Möglichkeiten. Oft ist es am
einfachsten, sich auf eine feste Struktur zu verlassen, und
nach bestimmten strings zu suchen. Wenn Du beispielsweise aus
www.heise.de alle Titel ermitteln willst, kann man beobachten, dass
diese immer die Form haben

<h3 class="anriss"> <a href="/newsticker/meldung/54105">c't magazin.tv: 
Preiswert surfen mit Modem und ISDN</a></h3>

Das heißt, Du suchst nach allen Zeilen, die mit '<h3 class="anriss"'
beginnen:

for line in urllib.urlopen("http://www.heise.de").readlines():
     if not line.startswith('<h3 class="anriss"'):
         continue

In diesen Zeilen willst Du den Teilstring zwischen dem zweiten >-Zeichen
und dem folgenden <-Zeichen. Die erste Position ergibt sich aus

     start = line.index(">", 20)+1

Der zweite Parameter von .index verlangt, dass die Suche erst ab
Position 20 beginnt, da auf Position 18 bereits ein >-Zeichen steht.
Das Ende ergibt sich dann aus

     ende = line.index("<", start)

und der gesamte Titel durch

     print line[start:ende]

Fertig!

Nun werden einige argumentieren, dass man das ganz anders lösen sollte.
Ich auch:

Ich würde den RDF-Feed von http://www.heise.de/newsticker/heise.rdf
benutzen und nicht die HTML-Seiten. Die kann man ganz normal mit
XML-Bibliotheken verarbeiten, ohne sich auf bestimmte Stringpositionen
verlassen zu müssen.

Ciao,
Martin