在pyquery中遍历对象

15 投票
6 回答
9608 浏览
提问于 2025-04-16 01:13

我正在用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>标签里的内容,以便处理它们呢?我尝试了:

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文档中找到了一个'每个' 函数。但是,我不明白如何用它来实现我想要的功能。假设我只想打印出<h3>的内容。这产生了一个语法错误:为什么呢?

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

6 个回答

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)

希望这对某些人有帮助,即使不是对最开始提问的人。

21

pyquery 1.2.3 版本开始(具体更新可以查看这个链接),你可以使用 PyQuery 对象的 items() 方法来逐个遍历每个项目,每个项目也会是一个 PyQuery 对象。

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

这个 items() 方法会返回一个 generator,这个功能在 Python 2 和 Python 3 中都可以使用。

7

我之前没用过pyquery,不过语法错误的原因是Python中的lambda表达式有点限制。你只能在里面写一个表达式(所以不能写像print这样的语句)。你可以通过使用一个函数来绕过这个限制,比如:

def my_print(x):
    print x

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

撰写回答