web-dev-qa-db-ja.com

最初の子供を得る美しいスープ

どうすれば最初の子供を得ることができますか?

 <div class="cities"> 
       <div id="3232"> London </div>
       <div id="131"> York </div>
  </div>

どうすればロンドンに行くことができますか?

for div in nsoup.find_all(class_='cities'):
    print (div.children.contents)

AttributeError: 'listiterator'オブジェクトに属性 'contents'がありません

13
Emmet B

div.childrenはイテレータを返します。

for div in nsoup.find_all(class_='cities'):
    for childdiv in div.find_all('div'):
        print (childdiv.string) #london, york

'\n'のような非タグが.childrenにあるため、AttributeErrorが発生しました。適切な子セレクターを使用して、特定のdivを見つけてください。

(もっと編集)あなたの例外を再現することはできません-これが私がしたことです:

In [137]: print foo.prettify()
<div class="cities">
 <div id="3232">
  London
 </div>
 <div id="131">
  York
 </div>
</div>

In [138]: for div in foo.find_all(class_ = 'cities'):
   .....:     for childdiv in div.find_all('div'):
   .....:         print childdiv.string
   .....: 
 London 
 York 

In [139]: for div in foo.find_all(class_ = 'cities'):
   .....:     for childdiv in div.find_all('div'):
   .....:         print childdiv.string, childdiv['id']
   .....: 
 London  3232
 York  131
6
thkang

最新バージョンのbs4(確かにbs4 4.7.1+)では、:first-childcss疑似セレクターにアクセスできます。素晴らしく、説明的です。

from bs4 import BeautifulSoup as bs

html = '''
<div class="cities"> 
       <div id="3232"> London </div>
       <div id="131"> York </div>
  </div>
  '''
soup = bs(html, 'lxml') #or 'html.parser'
first_children = [i.text for i in soup.select('.cities div:first-child')]
print(first_children)
2
QHarr

質問が最初のものだけを望んでいたとき、現在受け入れられている答えはすべての都市を取得します。

最初の子のみが必要な場合は、リストではなくイテレータを返す.childrenを利用できます。イテレータはその場でリストアイテムを生成することを忘れないでください。イテレータの最初の要素のみが必要なため、他のすべての都市要素を生成する必要はありません(したがって時間を節約できます)。

for div in nsoup.find_all(class_='cities'):
    first_child = next(div.children, None)
    if first_child is not None:
        print(first_child.string.strip())
0
TerryA