21

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

 <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'がありません

4

3 に答える 3

10

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

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

にあるようなタグがないため、AttributeErrorが発生'\n'しました.children。適切な子セレクターを使用して、特定の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
于 2013-03-19T03:02:53.997 に答える
9

最新バージョンのbs4(確かにbs4 4.7.1+)では、:first-childcss疑似セレクターにアクセスできます。素晴らしく、説明的です。soup.select_one最初の一致のみを返したい場合に使用しますsoup.select_one('.cities div:first-child').text。アクセサnot Noneを使用する前にテストすることをお勧めします。.text

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)
于 2019-09-06T05:14:47.790 に答える
6

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

最初の子のみが必要な場合.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())
于 2019-09-06T02:41:40.510 に答える