html stück weise parsen

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
ren22
User
Beiträge: 9
Registriert: Mittwoch 20. Oktober 2010, 21:13

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
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']]
ren22
User
Beiträge: 9
Registriert: Mittwoch 20. Oktober 2010, 21:13

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
ren22
User
Beiträge: 9
Registriert: Mittwoch 20. Oktober 2010, 21:13

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
Antworten