Итерация по объектам в pyquery
Я очищаю страницу с помощью pookon 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?
------ ОБНОВЛЕНИЕ --------
Я нашел функцию
Ответы
Ответ 1
Я никогда не использовал pyquery, однако источником синтаксической ошибки является то, что lambdas в Python немного ограничены, вы можете использовать только одно выражение внутри (так что никаких утверждений вроде print). Ты можешь
обойти это ограничение с помощью функции, например:
def my_print(x):
print x
formwraps.each(lambda e: my_print(e("h3").text()))
Ответ 2
Так как 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.
Ответ 3
Я думаю, вы можете сделать что-то вроде этого:
from pyquery import PyQuery as pq
def get_h3_contents(index, node):
d = pq(node)
d.find('h3').text()
formwraps.each(get_h3_contents)
Надеюсь, что это поможет кому-то, если не оригинальному плакату.
Ответ 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
Ответ 5
последние версии pookery позволяют использовать .items()
[h.text() for h in formwraps('h3').items()]
Ответ 6
Я думаю, что вы могли бы перебирать pyquery следующим образом:
for i in range(len(formwraps)):
print(formwraps.eq(i))
...