2010-07-13 134 views
13

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

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

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

如何获得<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() 

这将产生:

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

它看起来像有没有实际的迭代回事。我怎样才能单独提取每个元素?

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

------ UPDATE --------

我找到了一个 '每个' function in the pyquery docs。但是,我不明白如何将其用于我想要的。假设我只想打印出<h3>的内容。这会产生语法错误:为什么?

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

回答

7

我从来没有使用pyquery,语法错误的,不过源是在Python lambda表达式是一种有限的,你只能使用里面一个expresion(所以像打印任何语句)。您可以 规避使用函数此限制,e.g:

def my_print(x): 
    print x 

formwraps.each(lambda e: my_print(e("h3").text())) 
9

我认为你可以做这样的事情:

from pyquery import PyQuery as pq 

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

formwraps.each(get_h3_contents) 

希望帮助的人,如果不是原来的海报。

3

我想你可以遍历pyquery这样的:

for i in range(len(formwraps)): 
    print(formwraps.eq(i)) 
    ... 
4

你也可以做到这一点没有each方法:

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 
16

由于pyquery 1.2.3commit),你可以使用一个items()对象PyQuery为通过每个项目会为PyQuery对象:

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

items()返回generator,这将在两个Python 2和3

4

最近pyquery工作方法版本允许您使用.items()

[h.text() for h in formwraps('h3').items()]