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>标签的内部,以便我可以处理它们?我正在努力:

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 docs 中找到了一个“每个”函数。但是,我不明白如何将它用于我想要的。假设我只想打印出<h3>. 这会产生语法错误:为什么?

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

6 回答 6

21

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

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

该方法items()返回 a generator,这将适用于 Python 2 和 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 中的 lambdas 是有限的,你只能在里面使用一个表达式(所以没有像 print 这样的语句)。您可以使用函数来规避此限制,例如:

def my_print(x):
    print x

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

recent pyquery verions allow you to use .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

您也可以使用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
于 2012-12-05T00:45:52.903 回答