我正在使用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运算符吗?
------ -------- UPDATE
我找到了'每个'function in the pyquery docs。但是,我不明白如何将它用于我想要的东西。假设我只想打印出<h3>
的内容。这会产生语法错误:为什么?
formwraps.each(lambda e: print e("h3").text())
答案 0 :(得分:17)
自pyquery 1.2.3(commit)以来,您可以使用items()
对象的PyQuery
作为PyQuery
对象浏览每个项目:
print(type(formwraps.items()))
for my_div in formwraps.items():
print(my_div("h3").text())
方法items()
返回generator
,这将适用于Python 2和3。
答案 1 :(得分: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)
希望有人帮助某人,如果不是原始海报。
答案 2 :(得分:7)
我从来没有使用过pyquery,但是语法错误的根源是Python中的lambdas是有限的,你只能在里面使用一个expresion(所以没有像print这样的语句)。您可以 使用函数来规避这种限制,例如:
def my_print(x):
print x
formwraps.each(lambda e: my_print(e("h3").text()))
答案 3 :(得分:5)
最近的pyquery verions允许你使用.items()
[h.text() for h in formwraps('h3').items()]
答案 4 :(得分:4)
我认为你可以像这样迭代pyquery:
for i in range(len(formwraps)):
print(formwraps.eq(i))
...
答案 5 :(得分: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