2009-04-01 10 views
3

私は美しいスープで探検しているHTMLファイルのスニペットです。複雑な美味しいスープのクエリ

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

私は<strong class="sans">を持っており、任意の行のため<a href>を取得したいと思いは<td width="50%">の内側にあります。

Beautiful Soupを使用して複数の条件のHTMLファイルを照会することはできますか?

答えて

9

BeautifulSoupの検索メカニズムでは、「タグの属性に複雑なまたはインターロックの制限を課す必要がある場合は、名前の呼び出し可能オブジェクトを渡してください...」というようにドキュメントが推奨するように見えます。 (ok ...彼らは特に属性について話していますが、アドバイスはBeautifulSoup APIの根底にある精神を反映しています)。私は、この例では、ラムダを使用しましたが、実際には、あなたがこのラムダが持っているとして、あなたが複数のチェーンの要件を持っている場合は呼び出し可能な関数を定義することもできます

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

:あなたはワンライナーを使用する場合は

<a>タグにstrongの親がない場合、例外を発生させないために2つのfindParent('strong', 'sans')コールを作成します。適切な関数を使用すると、テストをより効率的にすることができます。

0
>>> 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>]