どうすれば最初の子供を得ることができますか?
<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'がありません
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
最新バージョンの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)
質問が最初のものだけを望んでいたとき、現在受け入れられている答えはすべての都市を取得します。
最初の子のみが必要な場合は、リストではなくイテレータを返す.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())