5

私は完全に困惑しています。大きなテーブルからスクレイピングした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()

なぜかはわかりませんが、反復できるのはtext_children1回だけであることがわかりました。それlistiteratorは私が理解するのに苦労しているタイプです。

私は、forループを使用して何かを反復処理できる場合、text_children[0]のような任意の1つの要素を呼び出すことができると想定できることに慣れています。イテレータの場合はそうではないようです。リストを作成する場合:

my_array = ["one","two","three"] 

my_array[1]配列の2番目の項目を表示するために使用できます。これを実行しようとするとtext_children[1]、エラーが発生します。

TypeError: 'listiterator' object is not subscriptable

イテレータの内容を取得するにはどうすればよいですか?

4

3 に答える 3

12

次の方法で、イテレータからリストを簡単に作成できます。

my_list = list(your_generator)

これで要素に添字を付けることができます:

print(my_list[1])

値を取得する別の方法は、 を使用することnextです。これはイテレータから次の値を引き出しますが、すでに発見したように、一度イテレータから値を引き出すと、常にそれを元に戻すことができるとは限りません (元に戻すことができるかどうかは完全に反復されているオブジェクトとそのnextメソッドが実際にどのように見えるか)。

その理由は、繰り返し処理できるオブジェクトが必要な場合が多いためです。イテレータは、すべての値を格納する必要がなく、要素を一度に 1 つずつ計算するので、その点で優れています。言い換えれば、一度にシステムのメモリを消費するイテレータの要素は 1 つだけです。リストやタプルでは、​​通常、反復を開始する前にすべての要素がメモリに格納されます。

于 2012-11-21T14:39:54.487 に答える
2

私はより一般的な答えを見つけようとします:

  • iterable は反復可能なオブジェクトです。これらには、リスト、タプルなどが含まれます。要求に応じて、反復子を提供します。

  • イテレータは、反復に使用されるオブジェクトです。リクエストごとに値を提供し、それが終了した場合は終了します。これらはジェネレータ、リスト イテレータなどですが、ファイル オブジェクトなどもあります。すべての反復子は反復可能であり、自身を反復子として指定します。

例:

a = []
b = iter(a)
print a, b # -> [] <listiterator object at ...>

もしあなたがそうするなら

for i in a: ...

a はそのメソッドを介して反復子を要求され、__iter__()この反復子は使い果たされるまで次の要素を照会されます。.next()これは( __next__()3.x では) メソッドを介して行われます。

インデックス作成はまったく別のものです。オブジェクトがメソッドを持たない場合、反復はインデックス付けによって発生する可能性がある.__iter__()ため、すべてのインデックス可能なオブジェクトは反復可能ですが、その逆はありません。

于 2012-11-21T15:05:49.433 に答える
2

前に述べたように、簡単な答えは、ジェネレーターからリストを作成することです。

そのようです:list(generator)

長い答えとその理由についての説明:

ジェネレーターを作成するとき、またはあなたの場合は美しいスープが使用するジェネレーターである「リストイテレーター」を作成するとき、実際にはアイテムのリストを作成していません。一度に1つずつ、特定の量のアイテムを反復する方法を知っているオブジェクト(ジェネレーター)を作成しています(next()

それが何を意味するか。

あなたが望むものの代わりに、ページのある本を言ってみましょう。

あなたはタイプライターを手に入れます。

タイプライターはページのある本を作成できますが、一度に 1 ページしか作成できません。さて、最初から for ループのように 1 つずつ見ていくと、はい、普通の本を読むのとほとんど同じです。

しかし、通常の本とは異なり、タイプライターがページを読み終えると、戻ることはできず、そのページはなくなります。

これが意味をなすことを願っています。

于 2012-11-21T14:43:41.680 に答える