2013-03-19 2 views
6

Как я могу получить первого ребенка?Красивый суп, получающий первого ребенка

<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' объект имеет

+1

'children' последовательность детей, каждый из которых имеет' contents'. Сама последовательность не имеет 'содержимого'. Это как '[1, 2, 3]' не является целым числом. Между тем, как и любая последовательность, чтобы получить первое значение, вы можете просто «next (iter (div.children))». – abarnert

ответ

4

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

'AttributeError: объект 'NavigableString' не имеет атрибута 'contents'', и когда я использую строку вместо содержимого, она дает' RuntimeError: превышение максимальной глубины рекурсии при вызове объекта Python' –

+1

@EmmetB см. В редакции – thkang

+0

Он печатает None, None then RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python –

Смежные вопросы