web-dev-qa-db-ja.com

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

<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>
91
tej.tan

これを試して

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

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)
104
bitstrider

これを試して:

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

他のリマインダー:

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

12
kiiru

おそらくあなたはやりたい

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

さらに別の方法-必要なすべてのタグに対して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
6
Dedek Mraz

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