2012-12-10 20 views
5

Ich benutze schöne Suppe, um bestimmte div-Tags herausziehen, und es scheint, dass ich einfache String-Matching nicht verwenden kann.Python regulären Ausdruck für schöne Suppe

Die Seite hat einige Tags in Form von

<div class="comment form new"...> 

, die ich ignoriert werden sollen, und auch einige Tags in Form von

<div class="comment comment-xxxx..."> 

wo die x eine ganze Zahl von beliebiger Länge darstellen , und die Ellipsen stellen eine willkürliche Anzahl anderer Werte dar, die durch Leerräume getrennt sind (was mir nicht wichtig ist). Ich kann den korrekten Regex-Ausdruck nicht herausfinden, zumal ich Pythons re-Klasse nie benutzt habe.

Mit

soup.find_all(class_="comment") 

findet alle Tags mit dem Wort Kommentar zu starten. Ich habe versucht,

soup.find_all(class_=re.compile(r'(comment)()(comment)')) 
soup.find_all(class_=re.compile(r'comment comment.*')) 

und viele andere Variationen, aber ich glaube, ich bin etwas offensichtlich hier, wie Regex Ausdrücke oder match() Arbeit fehlt. Kann mir jemand helfen?

+1

Erstens, verwenden Sie BS3 oder BS4? Man hat 'findAll', man hat' find_all', keines hat 'findall' ... – abarnert

+0

Sorry, BS4 - Ich habe nicht direkt aus meinem Code eingefügt, werde editieren. – user1890572

+0

Verdammt, weil ich eine Antwort für BS3 hatte ... aber für BS4 sieht es aus, als ob es keine Leerzeichen in Klassen vielleicht mag? Oder ich kenne BS4 einfach nicht gut genug. Ich kann "Kommentar", aber nicht "Kommentar Kommentar" zuordnen. Ich werde es mir ansehen. – abarnert

Antwort

15

Ich glaube, ich habe es:

>>> [div['class'] for div in soup.find_all('div')] 
[['comment', 'form', 'new'], ['comment', 'comment-xxxx...']] 

Beachten Sie, dass im Gegensatz zu dem entsprechenden Betrag in BS3, es ist nicht so:

['comment form new', 'comment comment-xxxx...'] 

Und das ist, warum Ihr regexps nicht übereinstimmen.

Aber man kann passen, zum Beispiel diese:

>>> soup.find_all('div', class_=re.compile('comment-')) 
[<div class="comment comment-xxxx..."></div>] 

Beachten Sie, dass BS tut das Äquivalent von re.search, nicht re.match, so dass Sie nicht 'comment-.*' brauchen. Wenn Sie natürlich 'comment-12345' aber nicht 'comment-of-another-kind entsprechen möchten, möchten Sie z. B. 'comment-\d+'.

+0

Ich erinnere mich, etwas in der BS4-Dokumentation darüber gelesen zu haben, aber es ist immer noch nicht intuitiv. Vielen Dank! Ich schlug meinen Kopf eine Stunde lang dagegen. – user1890572

+0

@ user1890572: Ich bin mir nicht sicher, warum, aber ich habe immer noch nicht die BS4-Dokumente über eine schnelle "Migration von BS3" Leitfaden von Drittanbietern gelesen, so habe ich mich daran gewöhnt, durch solche Probleme in meinem eigenen zu verwirren Code. Denk nur, wenn ich schlauer wäre, hätte ich nicht antworten können. :) – abarnert