【问题标题】:Why is this listiterator stuck?为什么这个 listiterator 卡住了?
【发布时间】:2012-11-21 03:46:32
【问题描述】:

我非常困惑。我有一块 HTML 是我从一个更大的表格中刮下来的。它看起来像这样:

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

(其实看起来更糟,但是我正则表达式掉了很多换行符)

我需要把这些线弄出来,把日期/金额线分开。开始的地方似乎是找到那个 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

这些应该是一样的。所以我很困惑。

【问题讨论】:

  • 你的意思是for i, each in enumerate(text_children):?
  • 它们应该是一样的。请记住,您只能遍历 text_children 一次,因为它将消耗生成器。
  • @gnibbler,感谢您指出我跳过了“枚举”——我在控制台中做得很好。我要澄清我的问题,但是......你是什么意思我只能迭代 text_children 一次?

标签: python beautifulsoup


【解决方案1】:

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

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

您的 for 循环有两个参数(ieach),因此 python 解释器期望迭代器提供一个二元素元组。如果只传入childGenerator() 提供的迭代器,python 只有一个元素可用,而不是它需要和阻塞的两个元素。但是,如果您通过 enumerate() 从迭代器创建枚举器,则解释器会获得它所需的二元素元组。

【讨论】:

  • Eesh。对不起,那是一个错字。这个问题没有一一列举。我需要为这个问题添加很多内容。
  • @gnibbler 似乎成功了,但我仍然不明白为什么。我已经遍历了 text_children 一次,所以再次遍历它没有任何结果。
【解决方案2】:

gnibbler 正确地解释了您只能使用一次生成器。只是为了进一步说明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多