首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代pyquery中的对象

迭代pyquery中的对象
EN

Stack Overflow用户
提问于 2010-07-13 18:29:02
回答 6查看 8.8K关注 0票数 15

我正在用Python的pyquery抓取一个页面,我对它返回的类型感到有点困惑,尤其是如何遍历结果列表。

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

代码语言:javascript
复制
<div class="formwrap">blah blah <h3>Something interesting</h3></div>
<div class="formwrap">more rubbish <h3>Something else interesting</h3></div>

如何逐个获取<h3>标记的内部内容,以便对其进行处理?我在试着:

代码语言:javascript
复制
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() 

这会产生以下结果:

代码语言:javascript
复制
<class 'pyquery.pyquery.PyQuery'>
<type 'list'>
<class 'pyquery.pyquery.PyQuery'>
Something interesting something else interesting

看起来没有真正的迭代在进行。如何逐个拉出每个元素?

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

-更新

我找到了一个“each”function in the pyquery docs。然而,我不知道如何使用它来做我想要的事情。假设我只想打印出<h3>的内容。这会产生一个语法错误:为什么?

代码语言:javascript
复制
formwraps.each(lambda e: print e("h3").text())
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-13 19:02:43

我从来没有使用过pyquery,但是语法错误的来源是Python中的lambdas是有限的,你只能在其中使用一个表达式(所以没有像print这样的语句)。您可以使用函数绕过此限制,例如:

代码语言:javascript
复制
def my_print(x):
    print x

formwraps.each(lambda e: my_print(e("h3").text()))
票数 7
EN

Stack Overflow用户

发布于 2013-07-03 10:03:53

由于pyquery 1.2.3 (commit),您可以使用PyQuery对象的items()作为PyQuery对象遍历每个项目:

代码语言:javascript
复制
print(type(formwraps.items()))
for my_div in formwraps.items():
    print(my_div("h3").text())

方法items()返回一个generator,这在Python2和Python3上都有效。

票数 22
EN

Stack Overflow用户

发布于 2011-08-20 00:55:03

我认为你可以这样做:

代码语言:javascript
复制
from pyquery import PyQuery as pq

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

formwraps.each(get_h3_contents)

希望这能帮助到一些人,如果不是原始海报的话。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3236208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档