2010-07-13 43 views
13

Tôi đang cạo một trang với pyquery của Python, và tôi bị nhầm lẫn bởi các kiểu nó trả về, và đặc biệt là cách lặp qua danh sách kết quả.Lặp lại các đối tượng trong pyquery

Nếu HTML của tôi trông hơi như thế này:

<div class="formwrap">blah blah <h3>Something interesting</h3></div> 
<div class="formwrap">more rubbish <h3>Something else interesting</h3></div> 

Làm thế nào để tôi nhận được bên trong <h3> thẻ, từng người một để tôi có thể xử lý chúng? Tôi đang cố gắng:

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() 

này tạo ra:

<class 'pyquery.pyquery.PyQuery'> 
<type 'list'> 
<class 'pyquery.pyquery.PyQuery'> 
Something interesting something else interesting 

Dường như không có sự lặp lại thực tế đang diễn ra. Làm thế nào tôi có thể rút ra từng phần tử riêng lẻ?

Câu hỏi bổ sung từ newbie: các dấu ngoặc vuông xung quanh [a] đang hoạt động như thế nào? Có vẻ như nó chuyển đổi một đối tượng Pyquery đặc biệt thành một danh sách. Có phải [] là một toán tử Python chuẩn không?

------ CẬP NHẬT --------

Tôi đã tìm thấy 'mỗi' function in the pyquery docs. Tuy nhiên, tôi không hiểu làm thế nào để sử dụng nó cho những gì tôi muốn. Nói rằng tôi chỉ muốn in nội dung của số <h3>. Điều này tạo ra một lỗi cú pháp: tại sao?

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

Trả lời

7

Tôi chưa bao giờ sử dụng pyquery, tuy nhiên nguồn gốc của lỗi cú pháp là lambdas trong Python là loại hạn chế, bạn chỉ có thể sử dụng một expresion bên trong (vì vậy không có báo cáo như in). Bạn có thể phá vỡ giới hạn này bằng cách sử dụng chức năng, ví dụ:

def my_print(x): 
    print x 

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

Tôi nghĩ rằng bạn có thể làm một cái gì đó như thế này:

from pyquery import PyQuery as pq 

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

formwraps.each(get_h3_contents) 

Hy vọng rằng sẽ giúp ai đó nếu không phải là poster ban đầu.

3

tôi nghĩ rằng bạn có thể duyệt qua pyquery như thế này:

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

Bạn cũng có thể làm điều đó mà không các each phương pháp:

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() 

Nó tạo ra kết quả như sau:

Something interesting 
Something else interesting 
16

Kể từ pyquery 1.2.3 (commit), bạn có thể sử dụng items() của một đối tượng PyQuery cho đi qua từng hạng mục như PyQuery đối tượng:

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

Phương pháp items() trả về một generator và điều này sẽ làm việc trên cả hai Python 2 và 3.

4

pyquery gần đây verions cho phép bạn sử dụng .items()

[h.text() for h in formwraps('h3').items()] 
Các vấn đề liên quan