Seite 1 von 1

Mit BeautifulSoup richtig schachteln [SOLVED!]

Verfasst: Sonntag 2. Juli 2006, 18:20
von dcc
Hallo Allerseits!

Ich möchte aus folgendem Html:
<h1 id="eins">Titel1</h1>
<h2>Untertitel 1</h2>
<p>Blah 1 Blah 1 Blah 1</p>
<p> mehr Blah1</p>
<p> noch mehr Blah1</p>

<h1 id="zwei">Titel2</h1>
<h2>Untertitel 2</h2>
<p>Blah 2 Blah 2 Blah 2</p>
<p> mehr Blah2</p>

<h1 id="n"> Titeln</h1>
....
Folgendes rausholen:
Id : eins
Titel: Titel1
Utitel: Untertitel1
Desc: Blah1 ... Nur das erste <p>-Tag!

Id : zwei
Titel: Titel2
Utitel: Untertitel2
Desc: Blah2 ...

...

Es tut mir leid, ich hab ein fürchterliches Brett vor dem Kopf.


Mit sowas wie:

Code: Alles auswählen

from BeautifulSoup import BeautifulSoup 
html = """ der_Kram_oben"""
soup = BeautifulSoup(html)

for h1 soup("h1"):
    print "Id: ", dict(h1.attrs).get("id")
    print "Titel: ", h1.string

for h2 soup("h2"):
    print "Utitel: ", h2.string

for p soup("p"):
    print "Desc: ", p.string
komme ich zwar prima an die Sachen dran, aber es ist halt nicht richtig geschachtelt und ich bekomme alle <p>-Tags und nicht nur das je erste...

Ich habe mich schon durch die BeautifulSoup-Doku gefressen und einiges ausprobiert, aber irgendwie hab ich ein totales Brett vorm Kopf.

Vielen Dank für Euren Hirnschmalz, mir ist es heute leider nicht vergönnt.

dcc

PS: Ich weiß, daß die Lösung in der Doku liegt und wahrscheinlich recht einfach ist. Ich sehe sie aber einfach nicht!

Verfasst: Sonntag 2. Juli 2006, 19:25
von BlackJack
Könnte ungefähr so gehen. Die Objekte haben einige Methoden um relativ zum bearbeiteten Tag andere Tags zu suchen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
from BeautifulSoup import BeautifulSoup

html = """\
<h1 id="eins">Titel1</h1>
<h2>Untertitel 1</h2>
<p>Blah 1 Blah 1 Blah 1</p>
<p> mehr Blah1</p>
<p> noch mehr Blah1</p>

<h1 id="zwei">Titel2</h1>
<h2>Untertitel 2</h2>
<p>Blah 2 Blah 2 Blah 2</p>
<p> mehr Blah2</p>
"""

soup = BeautifulSoup(html)

for head_1 in soup('h1'):
    print 'Id:', head_1['id']
    print 'Titel:', head_1.string
    head_2 = head_1.firstNextSibling('h2')
    print 'Untertitel:', head_2.string
    description = head_2.firstNextSibling('p')
    print 'Beschreibung:', description.string

Vielen Dank!

Verfasst: Sonntag 2. Juli 2006, 22:01
von dcc
Hallo BlackJack!

Vielen Dank! Dein Code läuft out-of-the-box! Ich hatte in der Doku die ganzen Methoden gesehen und damit rumgespielt. Leider bin ich nicht zu dem Ergebniss gekommen. Vielen herzlich Dank!

Gruß,

dcc