迭代pyquery中的对象

AP2*_*257 13 python pyquery

我正在使用Python的pyquery抓取一个页面,我对它返回的类型感到困惑,特别是如何迭代结果列表.

如果我的HTML看起来像这样:

<div class="formwrap">blah blah <h3>Something interesting</h3></div>
<div class="formwrap">more rubbish <h3>Something else interesting</h3></div>
Run Code Online (Sandbox Code Playgroud)

如何<h3>逐个获取标签内部,以便我可以处理它们?我尝试着:

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() 
Run Code Online (Sandbox Code Playgroud)

这会产生:

<class 'pyquery.pyquery.PyQuery'>
<type 'list'>
<class 'pyquery.pyquery.PyQuery'>
Something interesting something else interesting
Run Code Online (Sandbox Code Playgroud)

看起来似乎没有实际的迭代.如何单独拉出每个元素?

来自新手的额外问题:周围的方括号是[a]什么?看起来它将一个特殊的Pyquery对象转换为一个列表.是[]标准的Python运算符吗?

------更新--------

在pyquery文档中找到了'each' 函数.但是,我不明白如何将它用于我想要的东西.说我只想打印出来的内容<h3>.这会产生语法错误:为什么?

formwraps.each(lambda e: print e("h3").text())
Run Code Online (Sandbox Code Playgroud)

liv*_*ter 20

pyquery 1.2.3(commit)开始,您可以使用items()一个PyQuery对象来遍历每个项目作为PyQuery对象:

print(type(formwraps.items()))
for my_div in formwraps.items():
    print(my_div("h3").text())
Run Code Online (Sandbox Code Playgroud)

该方法items()返回一个generator,这将适用于Python 2和3.


Div*_*ick 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)
Run Code Online (Sandbox Code Playgroud)

希望有人帮助,如果不是原始海报.


die*_*ogs 7

我从来没有使用过pyquery,但是语法错误的根源是Python中的lambdas是有限的,你只能在里面使用一个expresion(所以没有像print这样的语句).您可以使用函数来规避此限制,例如:

def my_print(x):
    print x

formwraps.each(lambda e: my_print(e("h3").text()))
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为你可以像这样迭代 pyquery:

for i in range(len(formwraps)):
    print(formwraps.eq(i))
    ...
Run Code Online (Sandbox Code Playgroud)


gaw*_*wel 5

最近的pyquery版本允许您使用.items()

[h.text() for h in formwraps('h3').items()]
Run Code Online (Sandbox Code Playgroud)