15

Pythonのpyqueryを使用してページをスクレイピングしていますが、返されるタイプ、特に結果のリストを反復処理する方法に少し混乱しています。

私のHTMLが少しこのように見える場合:

<div class="formwrap">blah blah <h3>Something interesting</h3></div>
<div class="formwrap">more rubbish <h3>Something else interesting</h3></div>

<h3>タグの内部を1つずつ取得して、タグを処理できるようにするにはどうすればよいですか?私はしようとしています:

results_page = pq(response.read())
formwraps = results_page(".formwrap") 
print type(formwraps)
print type([formwraps])
for my_div in [formwraps]:
    print type(my_div)
    print my_div("h3").text() 

これにより、次のものが生成されます。

<class 'pyquery.pyquery.PyQuery'>
<type 'list'>
<class 'pyquery.pyquery.PyQuery'>
Something interesting something else interesting

実際の反復は行われていないようです。各要素を個別に引き出すにはどうすればよいですか?

初心者からの追加の質問:周りの角かっこは何をし[a]ていますか?特別なPyqueryオブジェクトをリストに変換しているようです。[]標準のPython演算子ですか?

- - - アップデート - - - -

pyqueryのドキュメントで「each」関数を見つけました。しかし、私はそれを私が望むものにどのように使用するかを理解していません。の内容を印刷したいだけだとしましょう<h3>。これにより構文エラーが発生します:なぜですか?

formwraps.each(lambda e: print e("h3").text())
4

6 に答える 6

21

pyquery 1.2.3commit)以降items()PyQueryオブジェクトを使用して各アイテムをPyQueryオブジェクトとして処理できます。

print(type(formwraps.items()))
for my_div in formwraps.items():
    print(my_div("h3").text())

メソッドはaをitems()返し、generatorこれはPython2と3の両方で機能します。

于 2013-07-03T02:03:52.783 に答える
10

私はあなたがこのようなことをすることができると思います:

from pyquery import PyQuery as pq

def get_h3_contents(index, node):
    d = pq(node)
    d.find('h3').text()

formwraps.each(get_h3_contents)

元のポスターではないにしても、誰かが助けてくれることを願っています。

于 2011-08-19T16:55:02.860 に答える
7

pyqueryを使用したことはありませんが、構文エラーの原因は、Pythonのラムダが制限されているため、内部で使用できる式は1つだけです(したがって、printのようなステートメントは使用できません)。次の関数を使用して、この制限を回避できます。

def my_print(x):
    print x

formwraps.each(lambda e: my_print(e("h3").text()))
于 2010-07-13T11:02:42.763 に答える
6

最近のpyqueryバージョンでは、.items()を使用できます

[h.text() for h in formwraps('h3').items()]
于 2014-01-15T19:12:20.853 に答える
5

私はあなたがこのようにpyqueryを繰り返すことができると思います:

for i in range(len(formwraps)):
    print(formwraps.eq(i))
    ...
于 2012-08-28T04:33:26.503 に答える
4

それぞれの方法なしでそれを行うこともできます:

from pyquery import PyQuery as pq
html = """
<div class="formwrap">blah blah <h3>Something interesting</h3></div>
<div class="formwrap">more rubbish <h3>Something else interesting</h3></div>
"""
formwraps = pq(html)(".formwrap")

for my_div in formwraps:
    print pq(my_div)("h3").text()

次の出力が生成されます。

Something interesting
Something else interesting
于 2012-12-05T00:45:52.903 に答える