如何获取迭代器的内容?

Ama*_*nda 4 python beautifulsoup

我很困惑.我有一个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>
Run Code Online (Sandbox Code Playgroud)

(实际上,它看起来更糟,但我重复了很多换行符)

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

text_soup = BeautifulSoup(text)
text_children = text_soup.find('td').childGenerator()
Run Code Online (Sandbox Code Playgroud)

我已经知道我只能迭代text_children一次,但我不明白为什么会这样.这是一种listiterator我很难理解的类型.

我习惯于假设如果我可以使用for循环遍历某些东西,我可以使用text_children [0]之类的东西调用任何一个元素.迭代器似乎不是这种情况.如果我创建一个列表:

my_array = ["one","two","three"] 
Run Code Online (Sandbox Code Playgroud)

我可以my_array[1]用来查看数组中的第二项.如果我尝试这样做,text_children[1]我会收到错误:

TypeError: 'listiterator' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

如何获取迭代器的内容?

mgi*_*son 8

您可以通过以下方法轻松地从迭代器构造列表:

my_list = list(your_generator)
Run Code Online (Sandbox Code Playgroud)

现在您可以下标元素:

print(my_list[1])
Run Code Online (Sandbox Code Playgroud)

另一种获得价值的方法是使用next.这将从迭代器中提取下一个值,但正如您已经发现的那样,一旦从迭代器中提取一个值,就不能总是将其重新放入(无论您是否可以将其重新放入,完全取决于正在迭代的对象以及它的next方法实际上是什么样的).

这样做的原因是,您通常只需要一个可以迭代的对象.迭代器适合它,因为它们一次计算元素1而不是需要存储所有值.换句话说,迭代器中只有一个元素一次消耗系统的内存 - 而不是列表或元组,其中所有元素通常在开始迭代之前存储在内存中.


glg*_*lgl 3

我尝试找出一个更通用的答案:

  • 可迭代对象是可以迭代的对象。这些包括列表、元组等。根据请求,它们提供迭代器。

  • 迭代器是用于迭代的对象。它对每个请求给出一个值,如果结束了,就结束了。这些是生成器、列表迭代器等,但也包括文件对象。每个迭代器都是可迭代的,并将自身作为迭代器。

例子:

a = []
b = iter(a)
print a, b # -> [] <listiterator object at ...>
Run Code Online (Sandbox Code Playgroud)

如果你这样做

for i in a: ...
Run Code Online (Sandbox Code Playgroud)

a 通过其方法请求迭代器__iter__(),然后查询该迭代器以获取下一个元素,直到耗尽。这是通过.next()(分别__next__()在 3.x 中)方法发生的。

索引是完全不同的事情。如果对象没有.__iter__()方法,则可以通过索引进行迭代,因此每个可索引对象都是可迭代的,但反之则不然。