<a>
の子であるすべての<li>
タグを取得したい:
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
</li>
</div>
私はこのような特定のクラスを持つ要素を見つける方法を知っています:
soup.find("li", { "class" : "test" })
ただし、<a>
の子である<li class=test>
をすべて検索する方法はわかりませんが、他の方法はありません。
私が選択したいように:
<a>link1</a>
これを試して
li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
print child
DOCには、子をfind/find_alldirectする方法を示す非常に小さなセクションがあります。
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument
あなたの場合、最初の直接の子であるlink1が必要です:
# for only first direct child
soup.find("li", { "class" : "test" }).find("a", recursive=False)
すべての直接の子が必要な場合:
# for all direct children
soup.find("li", { "class" : "test" }).findAll("a", recursive=False)
これを試して:
li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li
他のリマインダー:
Findメソッドは、最初に出現する子要素のみを取得します。 find_allメソッドはすべての子孫要素を取得し、リストに保存されます。
おそらくあなたはやりたい
soup.find("li", { "class" : "test" }).find('a')
さらに別の方法-必要なすべてのタグに対してTrue
を返すフィルター関数を作成します。
def my_filter(tag):
return (tag.name == 'a' and
tag.parent.name == 'li' and
'test' in tag.parent['class'])
次に、引数を指定してfind_all
を呼び出すだけです。
for a in soup(my_filter): # or soup.find_all(my_filter)
print a
「<li class=test>
の子であるが、他の子ではないすべてのa
を見つける方法は?」
以下のHTMLを考えます( select
と<a>
の違いを示すために別のselect_one
を追加しました):
<div>
<li class="test">
<a>link1</a>
<ul>
<li>
<a>link2</a>
</li>
</ul>
<a>link3</a>
</li>
</div>
解決策は、2つのCSSセレクターの間に配置される 子コンビネーター (>
)を使用することです。
>>> soup.select('li.test > a')
[<a>link1</a>, <a>link3</a>]
最初の子のみを検索する場合:
>>> soup.select_one('li.test > a')
<a>link1</a>