0

我非常困惑。我有一块 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

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

4

2 回答 2

1

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

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

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

于 2012-11-21T04:02:47.263 回答
0

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

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

于 2012-11-22T03:17:59.707 回答