データに関する詳細情報がなければ、考えられるすべての入力をカバーする簡潔なソリューションを提供することは困難です。途中であなたを助けるために、ここにウォークスルーがあり、あなたのニーズに合った解決策につながることを願っています.
次のようになります<div id="a">
(特定の ID を持つ要素は 1 つだけである必要があります)。
top_div = soup.find('div', {'id':'a'})
次に、すべての内部 div の取得に進むことができますclass='aa'
(複数ある可能性があります)。
aa_div = top_div.findAll('div', {'class':'aa'})
そこから、見つかった各 div のすべてのリンクを返すことができます。
links = [div.findAll('a') for div in aa_div]
は見つかったノードのリストを返すlinks
ため、ネストされたリストが含まれていることに注意してください。このようなリストを平坦化するには、さまざまな方法があります。div.findAll('a')
a
リストを繰り返し処理し、個々のリンクを出力する例を次に示します。
>>> from itertools import chain
>>> for a in chain.from_iterable(links):
... print a
...
<a id="ff" href="#">ff</a>
<a id="gg" href="#">gg</a>
上に示した解決策は、かなり長い道のりです。ただし、入力データをより深く理解することで、よりコンパクトなソリューションが可能になります。たとえば、データがあなたが示したとおりであり、常にそのデータが存在する場合div
、class='aa'
ソリューションは次のようになります。
>>> soup.find('div', {'class':'aa'}).findAll('a')
[<a id="ff" href="#">ff</a>, <a id="gg" href="#">gg</a>]
BeautifulSoup4 での CSS セレクターの使用
新しいバージョンの BeatifulSoup (バージョン 4) を使用している場合は、CSS セレクターのサポートを提供する.select()
メソッドを使用することもできます。この回答の冒頭で提供した精巧なソリューションは、次のように書き直すことができます。
soup.select("div#a div.aa a")
BeautifulSoup v3 では、soupselectを使用してこの機能を追加できます。
ただし、ドキュメントからの次のステートメントに注意してください(強調は私のものです):
これは、CSS セレクター構文を知っているユーザーにとって便利です。これらすべてを Beautiful Soup API で行うことができます。また、必要なのが CSS セレクターだけである場合は、lxml を直接使用することもできます。その方が高速だからです。しかし、これにより、単純な CSS セレクターを Beautiful Soup API と組み合わせることができます。