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のchildGenerator()メソッドは、iteratorPythonの組み込みiter()関数を介してオブジェクトを返します。イテレータには.next()、次のアイテムを返すかStopIteration、要素がなくなったときに発生するメソッドがあります。

列挙子は特別な種類のイテレータです。メソッドもありますが.next()、次の値だけを返すのではなく、カウントと次の値を含むタプルを返します。

forループは2つの引数(iおよびeach)を受け取るため、Pythonインタープリターはイテレーターが2要素のタプルを提供することを期待します。によって提供されるイテレータのみを渡す場合childGenerator()、Pythonには、必要な2つの要素ではなく、1つの要素しか使用できません。ただし、を介してイテレータから列挙子を作成するとenumerate()、インタプリタは必要な2要素のタプルを取得します。

于 2012-11-21T04:02:47.263 に答える
0

gnibblerは、ジェネレーターを1回しか消費できないと説明しているのは正しいです。さらに詳しく説明します。

ドキュメントによると、aniteratorはデータのストリームを表すオブジェクトです。すでにストリームを消費している(つまり、ストリームの最後に到達している)ため、ストリームを繰り返してもデータは生成されません。以前も同じ問題がありましたが、KarlKnechtelのコメントで問題は解決しました。私の説明が明確であることを願っています。

于 2012-11-22T03:17:59.707 に答える