Frage

Hier ist ein Ausschnitt aus einer HTML-Datei mit Schöner Suppe Ich erforsche.

<td width="50%">
    <strong class="sans"><a href="http:/website">Site</a></strong> <br /> 

Ich mag die <a href> für jede Linie erhalten, die die <strong class="sans"> hat und das in einem <td width="50%">.

Ist es möglich, eine HTML-Datei für diese mehr Bedingungen mit Schöner Suppe abzufragen?

War es hilfreich?

Lösung

BeautifulSoup-Suchmechanismen akzeptieren eine aufrufbare, die die Dokumentation erscheint für Ihren Fall zu empfehlen: „Wenn Sie komplexe oder ineinandergreifenden Beschränkungen eines Tags Attribut verhängen müssen, übergeben in einem abrufbaren Objekt für Namen, ...“. (Ok ... sie reden Attribute speziell, aber die Beratung spiegelt einen zugrunde liegenden Geist der BeautifulSoup API).

Wenn Sie einen Einzeiler:

soup.findAll(lambda tag: tag.name == 'a' and \
tag.findParent('strong', 'sans') and \
tag.findParent('strong', 'sans').findParent('td', attrs={'width':'50%'}))

Ich habe eine Lambda in diesem Beispiel, aber in der Praxis verwendet, können Sie eine aufrufbare Funktion definieren möchten, wenn Sie mehrere verkettete Anforderungen haben, da dies Lambda zwei findParent('strong', 'sans') machen muss ruft eine Ausnahme zu vermeiden erhöhen, wenn ein <a> Tag hat keine strong Elternteil. eine ordnungsgemäße Funktion verwenden, können Sie den Test effizienter machen.

Andere Tipps

>>> BeautifulSoup.BeautifulSoup("""<html><td width="50%">
...     <strong class="sans"><a href="http:/website">Site</a></strong> <br />
... </html>""" )
<html><td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
</td></html>
>>> [ a for a in strong.findAll("a") 
            for strong in tr.findAll("strong", attrs = {"class": "sans"}) 
                for tr in soup.findAll("td", width = "50%")]
[<a href="http:/website">Site</a>]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top