Перебор объектов в pyquery - PullRequest
13 голосов
/ 13 июля 2010

Я очищаю страницу с PyQuery Python, и меня немного смущают типы, которые она возвращает, и, в частности, как перебирать список результатов.this:

<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?

------ ОБНОВЛЕНИЕ --------

Я нашел функцию 'each' вдокументы для пикеров .Однако я не понимаю, как использовать это для того, что я хочу.Скажем, я просто хочу распечатать содержимое <h3>.Это приводит к синтаксической ошибке: почему?

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

Ответы [ 6 ]

17 голосов
/ 03 июля 2013

Поскольку 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.

9 голосов
/ 19 августа 2011

Я думаю, что вы можете сделать что-то вроде этого:

from pyquery import PyQuery as pq

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

formwraps.each(get_h3_contents)

Надеюсь, что это поможет кому-то, если не оригинальный плакат.

7 голосов
/ 13 июля 2010

Я никогда не использовал pyquery, однако источник синтаксической ошибки заключается в том, что лямбда-выражения в Python ограничены, вы можете использовать только одно выражение внутри (поэтому нет таких операторов, как print).Вы можете обойти это ограничение, используя функцию, например:

def my_print(x):
    print x

formwraps.each(lambda e: my_print(e("h3").text()))
5 голосов
/ 15 января 2014

последние версии pyquery позволяют использовать .items ()

[h.text() for h in formwraps('h3').items()]
4 голосов
/ 05 декабря 2012

Вы также можете сделать это без каждый метод:

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
4 голосов
/ 28 августа 2012

я думаю, что вы могли бы перебрать pyquery следующим образом:

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