Seite 1 von 1

html stück weise parsen

Verfasst: Donnerstag 25. November 2010, 13:15
von ren22
Hi liebes forum :D

bin noch ziemlicher python anfänger , erstmal vorweg ...

ich bin auf de suche wie man eine html datei stückweise parsen kann, also sozusagen brauche ich dass ganze block weise.

hier mal ein bsp was ich meine:

Code: Alles auswählen

<ul>
  <li>Suchmaschinen
    <ul>
      <li>Google</li>
      <li>AltaVista</li>
      <li>Fireball</li>
    </ul>
  </li>
  <li>Verzeichnisse
    <ul>
      <li>Yahoo</li>
      <li>Web.de</li>
      <li>Dino-Online</li>
    </ul>
  </li>
  <li>Was anderes</li>
  <li>Noch was anderes</li>
</ul>
also die seite besteht aus standart html code mit listen .. die sich immer wiederholen bloss mit unterschiedlichen werten in den listen.
alle listen möchte gerne seperat voneinander getrennt haben.

also
<ul> code bla 1 </ul>
<ul> code bla 2 </u>
<ul> code bla 3 </ul>
<ul> code bla 4 </u> etc.

jetzt würde ich es gerne so haben das alles innerhalb von <ul> bis </ul> beim ersten vorkommen irgentwohin gespeichert wird(listen) was ich dann später nach werten durchsuchen kann, aber das eigentliche problem ist ja das die abschnitte vom <ul></ul> mehrmals vorkommen, ich aber jeden "block" dann einzeln habe möchte ...

jemand ne idee wie ich die blöcke von einander trennen kann ?

danke

gruss ren22

Re: html stück weise parsen

Verfasst: Donnerstag 25. November 2010, 14:05
von BlackJack
@ren22: Dazu nimmt man einen HTML-Parser zur Hand. `BeautifulSoup` oder `lxml.html` würde ich empfehlen.

Code: Alles auswählen

from lxml import html


def main():
    source = '''\
        <ul>
        <li>Suchmaschinen
            <ul>
            <li>Google</li>
            <li>AltaVista</li>
            <li>Fireball</li>
            </ul>
        </li>
        <li>Verzeichnisse
            <ul>      <li>Yahoo</li>
            <li>Web.de</li>
            <li>Dino-Online</li>
            </ul>
        </li>
        <li>Was anderes</li>
        <li>Noch was anderes</li>
        </ul>'''
    
    root = html.fromstring(source)
    lists = root.xpath('li/ul')
    print [[x.text for x in xs.xpath('li')] for xs in lists]

if __name__ == '__main__':
    main()
Ausgabe:

Code: Alles auswählen

[['Google', 'AltaVista', 'Fireball'], ['Yahoo', 'Web.de', 'Dino-Online']]

Re: html stück weise parsen

Verfasst: Donnerstag 25. November 2010, 22:04
von ren22
danke BlackJack

so hatte ich mit das ungefähr vorgestellt wie du es geschrieben hast. jetzt hat man zwei listen wo man sich die werte einzeln ausgeben lassen kann.

aber was mir echt noch zu hoch ist, ist:

Code: Alles auswählen

print [[x.text for x in xs.xpath('li')] for xs in lists]
kannst du mich mal auf die entsprechende doku verweisen oder mir ein wenig erklären was du da genau in der doppelten for schleife genau machst und für was die eckigen klammern stehen ?

danke

Re: html stück weise parsen

Verfasst: Donnerstag 25. November 2010, 22:48
von /me
ren22 hat geschrieben:kannst du mich mal auf die entsprechende doku verweisen oder mir ein wenig erklären was du da genau in der doppelten for schleife genau machst und für was die eckigen klammern stehen ?
Im Tutorial gibt es den Abschnitt über List Comprehensions. Wenn du mit dem Verständnis Probleme bekommen solltest, dann fang einfach ein paar Kapitel früher mit Lesen an.

Re: html stück weise parsen

Verfasst: Freitag 26. November 2010, 22:19
von ren22

Code: Alles auswählen

from lxml import html
import lxml.html

def main():
    source = '''\
        <ul>
        <li>Suchmaschinen
            <ul>
            <li>Google</li>
            <li>AltaVista</li>
            <li>Fireball</li>
            </ul>
        </li>
        <li>Verzeichnisse
            <ul>      <li>Yahoo</li>
            <li>Web.de</li>
            <li>Dino-Online</li>
            </ul>
        </li>
        <li>Was anderes</li>
        <li>Noch was anderes</li>
        </ul>'''
   
    root = html.fromstring(source)
    lists = root.xpath('li/ul')
    
    #profi for schleife..einzeiler :D
    #print [[x.text for x in xs.xpath('li')] for xs in lists]
    
    #hier die zerlegte for doppel schleife
    for xs in lists:
        for x in xs.xpath('li'):
            print x.text

if __name__ == '__main__':
    main()
sollte wohl so eher für anfänger zu verstehen sein :D

danke

gruss ren22