2010-04-03 128 views
5

我有这样的代码,获取使用BeautifulSoupPython的美丽汤参数

从页面中的一些文本
soup= BeautifulSoup(html) 
body = soup.find('div' , {'id':'body'}) 
print body 

我想使这是一个可重复使用的函数,它在一定的htmlText和与之相匹配的,如标签以下

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

但是,如果我作出这样

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

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

我只得到div元素的电话, body属性似乎被忽略。

有没有办法解决这个问题?

回答

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

然后:

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

感谢您的回答,它的工作。我不知道可以使用*解压列表,认为只有使用* \ *的字典可以工作。 – scott 2010-04-03 12:37:01

+0

@scott:阅读文章Mark在他的回答中链接到 – 2010-04-03 12:43:55

+0

@EliBendersky太棒了!但任何想法如何我们可以解压一个单一的字典密钥(如“班”在'del标签[“类”]')? http://stackoverflow.com/questions/41792761/calling-and-using-an-attribute-stored-in-variable-using-beautifulsoup-4 – JinSnow 2017-02-02 21:22:31

3

我想你只需要在这里添加星号:

body = soup.find(*atrs) 

没有你正在传递一个参数,它是一个元组星号:

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

带星号的元组展开并声明变成相当于你想要什么:

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

this article有关使用*args表示法以及相关**kwargs的更多信息。

+1

++,这是一个不错的选择。 – 2010-04-03 12:35:35

+0

感谢您的链接,我现在正在阅读它。 btw我不得不在参数列表和soup.find位置添加两个星号。 – scott 2010-04-03 12:44:56