2010-04-03 28 views
5

tôi có mã này mà lấy về một số văn bản từ một trang sử dụng BeautifulSoupPython luận súp đẹp

soup= BeautifulSoup(html) 
body = soup.find('div' , {'id':'body'}) 
print body 

tôi muốn thực hiện điều này như một chức năng tái sử dụng mà mất trong một số htmlText và các thẻ để phù hợp với nó như sau

def parse(html, atrs): 
soup= BeautifulSoup(html) 
body = soup.find(atrs) 
return body 

Nhưng nếu tôi thực hiện cuộc gọi như thế này

parse(htmlpage, ('div' , {'id':'body'}")) or like 

parse(htmlpage, ['div' , {'id':'body'}"]) 

tôi nhận được chỉ là phần tử div, thuộc tính cơ thể dường như bị bỏ qua.

Có cách nào để sửa lỗi này không?

Trả lời

7
def parse(html, *atrs): 
soup= BeautifulSoup(html) 
body = soup.find(*atrs) 
return body 

Và sau đó:

parse(htmlpage, 'div', {'id':'body'}) 
+1

Cảm ơn câu trả lời của bạn, nó đã hoạt động. Tôi không biết rằng một trong những có thể giải nén danh sách bằng cách sử dụng *, nghĩ rằng chỉ có dicts làm việc như thế bằng cách sử dụng * \ *. – scott

+0

@scott: đọc bài viết Mark được liên kết đến trong câu trả lời của mình –

+0

@EliBendersky Tuyệt vời! Nhưng bất kỳ ý tưởng làm thế nào chúng ta có thể giải nén một khóa từ điển duy nhất (chẳng hạn như "class" trong 'del tag [" class "]')? http://stackoverflow.com/questions/41792761/calling-and-using-an-attribute-stored-in-variable-using-beautifulsoup-4 – JinSnow

3

Tôi nghĩ rằng bạn chỉ cần thêm một dấu hoa thị ở đây:

body = soup.find(*atrs) 

Nếu không có dấu hoa thị bạn đang đi qua một tham số duy nhất mà là một tuple:

body = soup.find(('div' , {'id':'body'})) 

Với dấu hoa thị các tuple được mở rộng và tuyên bố trở nên tương đương với những gì bạn muốn:

body = soup.find('div' , {'id':'body'}) 

Xem this article để biết thêm thông tin về cách sử dụng ký hiệu *args và số liên quan **kwargs.

+1

++, đây là một lựa chọn tốt đẹp. –

+0

Cảm ơn bạn đã liên kết, tôi đang đọc nó ngay bây giờ. btw Tôi phải thêm hai dấu hoa thị vào cả danh sách tham số và trong vị trí soup.find. – scott

Các vấn đề liên quan