2013-03-19 35 views
6

Wie kann ich das erste Kind bekommen?Schöne Suppe bekommen das erste Kind

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

Wie kann ich London bekommen?

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

Attribute: 'ListIterator' Objekt hat kein Attribut

+1

'children' ist eine Folge von Kindern, von denen jeder' contents' hat. Die Sequenz selbst hat keinen Inhalt. Es ist genau wie '[1, 2, 3]' ist keine Ganzzahl. In der Zwischenzeit kann man, wie bei jeder anderen Sequenz, den ersten Wert "nur" (iter (div.children)) '. – abarnert

Antwort

4

div.children 'Inhalt' gibt einen Iterator.

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

Attribute wurde angehoben, wegen Nicht-Tags wie '\n' in .children sind. Verwenden Sie einfach den richtigen Child-Selektor, um das spezifische div zu finden.

(mehr bearbeiten) können Sie Ihre Ausnahmen nicht reproduzieren - hier ist das, was ich getan habe:

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' Objekt hat kein Attribut 'contents'', und wenn ich string anstelle von Inhalt verwende, gibt es' RuntimeError: maximale Rekursionstiefe beim Aufruf eines Python Objekts überschritten' –

+1

@EmmetB siehe Edit – thkang

+0

Es druckt None, None then RuntimeError: Maximale Rekursionstiefe beim Aufruf eines Python-Objekts überschritten –