Python 第一个孩子吃的汤很好

Python 第一个孩子吃的汤很好,python,beautifulsoup,Python,Beautifulsoup,我怎样才能得到第一个孩子 <div class="cities"> <div id="3232"> London </div> <div id="131"> York </div> </div> AttributeError:“listiterator”对象没有属性“contents”div。children返回迭代器 for div in nsoup.find_all(class_='

我怎样才能得到第一个孩子

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

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
已引发AttributeError,因为在.children中存在类似“\n”的非标记。只需使用适当的子选择器来查找特定的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

目前公认的答案适用于所有城市,而问题只涉及第一个城市

如果只需要第一个子项,则可以利用返回迭代器而不是列表的.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())

有了现代版本的bs4,当然bs4.7.1+您可以访问:第一个子css伪选择器。好的和描述性的。使用soup.select_one如果您只想返回第一个匹配项,即soup.select_one'.cities div:first child'.text。在使用.text访问器之前,最好先测试is not None

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)

AttributeError:'NavigableString'对象没有属性'contents',当我使用字符串而不是内容时,它会给出RuntimeError:调用Python对象时超过最大递归深度它打印None,None然后运行时Error:调用Python对象时超过最大递归深度by div['id']或类似div.get'id',None。与从听写器中检索内容相同,子项是一个子项序列,每个子项都有内容。序列本身没有内容。就像[1,2,3]不是整数一样。同时,像任何序列一样,要获得第一个值,只需nextiterdiv.children。
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)