Erste Gehversuche mit BeatifulSoup

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
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

hallo zusammen,

ich mache gerade meine ersten gehversuche mit BeautifulSoup. Ich denke das ich das im Grunde schon verstanden habe wie ich es anwenden kann.
In den meisten fällen funtioniert es auch schon. Nun bin ich aber auf ein Problem gestoßen...

Code: Alles auswählen

for details in soup_.findAll("div", {"class" : "beschreibung"}):
liefert mir folgendes Ergebnis für details:

Code: Alles auswählen

<div class="beschreibung">
<!-- Jahr -->
<strong class="main">Jahr:</strong> 
2008<br/>
<!-- Jahr Ende -->
<!-- Genre -->
<strong class="main">Genre:</strong> 
Action | Krimi | Drama<br/>
<!-- Genre Ende -->
<!-- Sprache -->
<strong class="main">Sprache:</strong> 
Deutsch DTS-HD | Englisch DTS-HD<br/>
<!-- Sprache Ende -->
<!-- Länge -->
<strong class="main">Laufzeit:</strong> 
90 Minuten<br/>
<!-- Länge Ende -->


soweit so gut... aber irgendwie komme ich jetzt nicht an die einzelnen Details...

Code: Alles auswählen

sound = re.compile('<strong class="main">Sprache:</strong>(.+?)<br />', re.DOTALL).findall(details)[0]
liefert immer einen Fehler:
sound = re.compile('<strong class="main">Sprache:</strong>(.+?)<br />', re.DOTALL).findall(content)[0]
TypeError: expected string or buffer
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: findAll ist veraltet, man sollte die Python-Style-Guide-konforme schreibweise find_all verwenden. Warum willst Du plötzlich mit regulären Ausdrücken arbeiten. BS bietet doch eine elegantere Baum-Ansicht:

Code: Alles auswählen

for details in soup_.find_all("div", {"class" : "beschreibung"}):
    info = {s.text.rstrip(':'): s.next_sibling.strip() for s in details.find_all("strong")}
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

@Sirius3:

da hab ich dann wohl noch eine veraltete Python Dokumentation... Danke für den Hinweis!

Ich bin zu regulären Ausdrücken gewechselt, da ich in BS keine Möglichkeiten mehr gesehen hatte.
Das war dann wohl ein Irrtum.

ich hab jetzt mal folgendes probiert:

Code: Alles auswählen

    for details in soup_.find_all("div", {"class" : "beschreibung"}):
        info = {s.text.rstrip(':'): s.next_sibling.strip() for s in details.find_all("strong")}
        print info
dann kommt aber auch eine Fehlermeldung:
info = {s.text.rstrip(':'): s.next_sibling.strip() for s in details.find_all("strong")}
TypeError: 'NoneType' object is not callable
so richtig verstehe ich das noch nicht...
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

okay,

ich habe jetzt mal versucht das ganze anhand der BS-Beschreibung nachzuvollziehen...

wenn ich das Ganze wie folgt abändere:

Code: Alles auswählen

for details in soup_.find_all("div", {"class" : "beschreibung"}):
    info = {details.text.rstrip(':'): details.next_sibling.strip() for s in details.find_all("strong")}
    print (repr(info))
bekomme ich folgendes Ergebnis:

Code: Alles auswählen

{u"\n\nJahr: \r\n2010\n\n\nGenre: \r\nThriller | Mystery\n\n\nSprache: \r\nDeutsch DTS\n\n\nLaufzeit: \r\n76 Minuten\n\n": u''}
nur wie komme ich jetzt an die Daten ran... darauf habe ich keine Hinweis gefunden.
Antworten