Beautiful Soup findall Frage (gelöst)

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
schneseb
User
Beiträge: 7
Registriert: Donnerstag 13. August 2009, 12:40

Hallo zusammen,

ich befasse mich erst seit kurzem mit Python und bin doch recht angetan von den einfachen Möglichkeiten, mit denen ich viel erreichen kann.

Konkret habe ich eine Frage zu der Methode findall von Beautiful Soup. Ich habe in der Dokumentation (http://www.crummy.com/software/Beautifu ... *kwargs%29) schon eine wirklich mächtige Möglichkeit gefunden, bestimmte Tags zu extrahieren. Vielleicht ist mein Wunsch jetzt gar nicht so weit und jemand weiß das.

Bis jetzt habe ich sowas anhand der Doku erstellt.

Code: Alles auswählen

allTds = soup.findAll('td',{'class' : 'std'})
Damit finde ich alle TD tags, die als class "std" haben. Ich zeige jetzt mal die Zeile, die ich genau möchte:

Code: Alles auswählen

<td class="std" onclick="test("test");">
Hier steht der text, der mich interessiert.</td>
Ich würde also gerne in den Aufruf oben noch gerne einbauen, dass ich das nur haben will, wenn noch die onklick Methode mit in dem td Tag enthalten ist.

Geht das auch so einfach irgendwie, wie das Beispiel oben, oder muss man dann mit RegExp etc. arbeiten?

Danke!
Zuletzt geändert von schneseb am Donnerstag 10. September 2009, 08:23, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würde vermuten:

Code: Alles auswählen

soup.findAll(
    'td',
   {'class'   : 'std',
    'onclick' :  True}
)
(Zeileneinrückungen zwecks Lesbarkeit, ist Geschmackssache)
schneseb
User
Beiträge: 7
Registriert: Donnerstag 13. August 2009, 12:40

Hallo,

wie geil ist das denn? :D Funktioniert bestens! Irgendwie mag ich Python 8)

Besten dank für deine Hilfe!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

War jetzt eigentlich nur den von dir verlinkten Abschnitt lesen und ein bißchen kombinieren. ;)
BlackJack

Was die Einrückung von dem `dict` angeht -- sollte nicht auch das hier gehen!?

Code: Alles auswählen

soup.findAll('td', 'std', onclick=True)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:

Code: Alles auswählen

soup.findAll('td', 'std', onclick=True)
Meines Wissens müsste man hier ``class='std'`` als zweites Argument einsetzen und dann zickt Python rum wegen dem reservierten Schlüsselwort. Deshalb wurde die Alternative geschaffen, die Attribute als `dict` zu übergeben.
BlackJack

@snafu: Nein deshalb kann man das ``class``-Attribut auch ohne Keyword als zweites Argument übergeben, weil es eben so häufig als HTML-Attribut vorkommt und man so nicht zwingend ein `dict` erstellen muss. Und das `findAll` kann man sich auch noch sparen:

Code: Alles auswählen

In [12]: soup
Out[12]: <body><p class="c">A</p><p>B</p></body>

In [13]: soup.findAll('p')
Out[13]: [<p class="c">A</p>, <p>B</p>]

In [14]: soup.findAll('p', 'c')
Out[14]: [<p class="c">A</p>]

In [15]: soup('p', 'c')
Out[15]: [<p class="c">A</p>]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Warum hat man denn den Weg so gewählt und ``class`` als Parameter festgelegt?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@jbs: Ich dachte das wird aus snafu's und meinem letzten Beitrag deutlich: Das HTML-Attribut "class" wird häufig benötigt um Elemente auszuwählen, man kann es aber nicht als Schlüsselwort-Argument schreiben, weil es ein reserviertes Wort der Sprache Python ist. Man müsste also sonst den umständlicheren Weg über ein Dictionary gehen.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Das war mir klar. Nur warum verwendet man ein Schlüsselwort?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jbs hat geschrieben:Nur warum verwendet man ein Schlüsselwort?
Wie schon gesagt: Man verwendet *kein* Schlüsselwort für `class`.
schneseb
User
Beiträge: 7
Registriert: Donnerstag 13. August 2009, 12:40

snafu hat geschrieben:War jetzt eigentlich nur den von dir verlinkten Abschnitt lesen und ein bißchen kombinieren. ;)
:oops: Du hast Recht, nachdem du das geschrieben hat und ich noch weiter rumgestöbert habe, hab ich es auch gelesen :)
Antworten