2009-06-14 3 views
8

Vì vậy, tôi đang học Python một cách chậm chạp, và đang cố gắng tạo một hàm đơn giản sẽ thu thập dữ liệu từ trang điểm số cao của trò chơi trực tuyến. Đây là mã của người khác mà tôi viết lại thành một hàm (có thể là vấn đề), nhưng tôi nhận được lỗi này. Đây là mã:Tại sao tôi nhận được "ResultSet" không có thuộc tính 'findAll' "bằng cách sử dụng BeautifulSoup bằng Python?

>>> from urllib2 import urlopen 
>>> from BeautifulSoup import BeautifulSoup 
>>> def create(el): 
    source = urlopen(el).read() 
    soup = BeautifulSoup(source) 
    get_table = soup.find('table', {'id':'mini_player'}) 
    get_rows = get_table.findAll('tr') 
    text = ''.join(get_rows.findAll(text=True)) 
    data = text.strip() 
    return data 

>>> create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13') 

Traceback (most recent call last): 
    File "<pyshell#18>", line 1, in <module> 
    create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13') 
    File "<pyshell#17>", line 6, in create 
    text = ''.join(get_rows.findAll(text=True)) 
AttributeError: 'ResultSet' object has no attribute 'findAll' 

Xin cảm ơn trước.

+0

Đối với những gì nó có giá trị: đặt tên cho biến của bạn "đầu tiên", "thứ hai", vv là phong cách khủng khiếp. Bạn thực sự nên mô tả hơn - các tên cụ thể tùy thuộc vào bạn, tất nhiên, nhưng tôi có thể sử dụng "urlcontent", "parser", "mp_tables", v.v. –

+0

Ngày thứ ba của tôi với Python. Tôi cần phải làm điều đó để giữ nó thẳng trong đầu tôi. Điều đó sẽ tốt hơn khi thời gian trôi qua ... – Alex

+0

Tôi đã thay đổi tên biến. Hy vọng thats tốt hơn. – Alex

Trả lời

19

Wow. Triptych đã cung cấp một số great answer cho một câu hỏi liên quan.

Chúng tôi có thể thấy, from BeautifulSoup's source code, rằng ResultSet các lớp con list.

Trong ví dụ của bạn, get_rows là một thể hiện của lớp ResultSet của BS,
và kể từ BS của ResultSet lớp con list, có nghĩa là get_rows là danh sách.

get_rows, như một thể hiện của ResultSet, không không có một phương pháp findAll thực hiện; do đó lỗi của bạn.
Điều mà Triptych đã thực hiện khác nhau là lặp lại trong danh sách đó.
Phương thức của Triptych hoạt động vì các mục trong danh sách get_rows là các thể hiện của lớp Thẻ của BS; có phương pháp findAll.

Vì vậy, để sửa chữa mã của bạn, bạn có thể thay thế ba dòng cuối cùng của phương pháp create của bạn với một cái gì đó như thế này:

for row in get_rows: 
    text = ''.join(row.findAll(text=True)) 
    data = text.strip() 
    print data 

chú Leonard Richardson: không có cách nào để tôi có ý định hạ thấp chất lượng công việc của bạn bằng cách gọi nó là BS ;-)

+0

Cảm ơn bạn đã hét lên :) – Triptych

+0

Đừng đề cập đến nó: Công việc tuyệt vời xứng đáng được công nhận! – bernie

+0

'văn bản = True' chỉ là những gì tôi đang tìm kiếm! –