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&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)
如何获取迭代器的内容?
您可以通过以下方法轻松地从迭代器构造列表:
my_list = list(your_generator)
Run Code Online (Sandbox Code Playgroud)
现在您可以下标元素:
print(my_list[1])
Run Code Online (Sandbox Code Playgroud)
另一种获得价值的方法是使用next.这将从迭代器中提取下一个值,但正如您已经发现的那样,一旦从迭代器中提取一个值,就不能总是将其重新放入(无论您是否可以将其重新放入,完全取决于正在迭代的对象以及它的next方法实际上是什么样的).
这样做的原因是,您通常只需要一个可以迭代的对象.迭代器很适合它,因为它们一次计算元素1而不是需要存储所有值.换句话说,迭代器中只有一个元素一次消耗系统的内存 - 而不是列表或元组,其中所有元素通常在开始迭代之前存储在内存中.
我尝试找出一个更通用的答案:
可迭代对象是可以迭代的对象。这些包括列表、元组等。根据请求,它们提供迭代器。
迭代器是用于迭代的对象。它对每个请求给出一个值,如果结束了,就结束了。这些是生成器、列表迭代器等,但也包括文件对象。每个迭代器都是可迭代的,并将自身作为迭代器。
例子:
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__()方法,则可以通过索引进行迭代,因此每个可索引对象都是可迭代的,但反之则不然。
| 归档时间: |
|
| 查看次数: |
8434 次 |
| 最近记录: |