2012-11-21 58 views
0

我很困惑。我有一块HTML,我从一张大桌子上刮掉了。它看起来大约是这样的:为什么这个listiterator卡住了?

<td align="left" class="page">Number:\xc2\xa0<a class="topmenu" href="http://www.example.com/whatever.asp?search=724461">724461</a> Date:\xc2\xa01/1/1999 Amount:\xc2\xa0$2.50 <br/>Person:<br/><a class="topmenu" href="http://www.example.com/whatever.asp?search=LAST&amp;searchfn=FIRST">LAST,\xc2\xa0FIRST </a> </td> 

(事实上,它看起来更糟,但我regexed了大量换行符)

我需要这些行,并打破了日期/金额线。它似乎是要开始找到HTML块的孩子的地方。该块是一个字符串,因为这正是正则表达式给我的回报。所以我做:

text_soup = BeautifulSoup(text) 
text_children = text_soup.find('td').childGenerator() 

我可以通过孩子与迭代

for i,each in enumerate(text_soup.find('td').childGenerator()): 
    print type(each) 
    print i, ":", each 

但与

for i, each in enumerate(text_children): 
    ...etc 

这些应该是相同的。所以我很困惑。

+4

你的意思是我为每个枚举(text_children):'? –

+1

他们应该工作一样。记住你只能迭代text_children一次,因为它会消耗生成器。 –

+0

@gnibbler,谢谢你指出我跳过了“枚举” - 我在控制台中做得很好。我要澄清我的问题,但是......你是什么意思,我只能迭代text_children一次? – Amanda

回答

0

gnibbler在解释你只能消耗一次发电机是正确的。只是进一步说明:

根据docsiterator是代表数据流的对象。由于您已经使用了流(即您到达流的末尾),因此重复此流不会产生任何数据。我之前也遇到同样的问题,但Karl Knechtel的comment为我解决了一些问题。希望我的解释清楚。

1

BeautifulSoup的childGenerator()方法返回一个iterator对象通过python的内置iter()函数。迭代器有一个.next()方法,该方法在元素用完时返回下一个项目或提高StopIteration

enumerator是一种特殊的迭代器。它也有一个.next()方法,但不是只返回下一个值,而是返回一个包含count和下一个值的元组。

您的for循环需要两个参数(ieach),所以Python解释器期望迭代器提供一个双元素元组。如果你只传入由childGenerator()提供的迭代器,Python只有一个可用的元素,而不是它需要的两个元素和扼流器。但是,如果您通过enumerate()从迭代器创建枚举器,那么解释器会获取它所需的双元素元组。

+0

Eesh。对不起,这是一个错字。这个问题没有列举。我需要增加很多问题。 – Amanda

+0

@gnibbler似乎已经钉了它,但我仍然不明白*为什么*。我已经迭代了一次text_children,所以再次遍历它没有任何结果。 – Amanda