BeautifulSoupを使用してノードの子を見つける方法


114

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

回答:


124

これを試して

li = soup.find('li', {'class': 'text'})
children = li.findChildren("a" , recursive=False)
for child in children:
    print child

3
または、必要なものを表す式を抽出するだけですsoup.find('li', {'class': 'text'}).findChildren()
Karl Knechtel、2011年

3
しかし、病棟の後ではなく、最初の<a>タグを取得する方法。のようなものfind(li).find(a).firstChild()
tej.tan

"再帰的な" kwargをありがとう:)
Swift

121

DOCには非常に小さなセクションがあり、直接の子を見つける/見つける方法を示しています。

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)

12

たぶんあなたはやりたい

soup.find("li", { "class" : "test" }).find('a')

1
私はそれを見つけるだろうと思う<a> link2 </a>だけでなく、私は望んでいないこと
tej.tan

1
これ<a>link1</a>は、質問で指定されたHTMLでどのように選択するかという質問に答えますが、最初<li class="test"><a>要素に要素が含まれておらず、を含むクラスをli持つ他の要素がある場合、これは失敗testします<a>
radzak

11

これを試して:

li = soup.find("li", { "class" : "test" })
children = li.find_all("a") # returns a list of all <a> children of li

その他のリマインダー:

findメソッドは、最初に出現する子要素のみを取得します。find_allメソッドはすべての子孫要素を取得し、リストに格納されます。


2
質問者は、上記の2つのオプションのいずれも望んでいません。彼は直接の子だけであるすべてのリンクを望んでいます。
Ahsan Roy、

8

「他のa子では<li class=test>なく子であるすべてを見つける方法は?」

以下のHTMLを考えると(私は別の追加<a>の間TEの違いを示すためにselectとの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>

これは私が探していたものです。間違った方法で供給していた。Forgot>はCSSセレクターです。ありがとう!
LFMekz

7

さらに別の方法- 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.