Python美丽汤参数

8
我有这样一段代码,使用BeautifulSoup从页面中获取一些文本。
soup= BeautifulSoup(html)
body = soup.find('div' , {'id':'body'})
print body

我希望您能够将这段代码制作成一个可重复使用的函数,该函数需要接收一些html文本和需要匹配的标签,示例如下:
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属性似乎被忽略了。有没有办法解决这个问题?
2个回答

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

然后:

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

1
谢谢你的回答,它起作用了。我不知道可以使用来解包列表,我以为只有字典可以使用*这样的方式。 - scott
@EliBendersky 很好!但是你有什么想法可以解包单个字典键(例如在del tag["class"]中的“class”)吗?http://stackoverflow.com/questions/41792761/calling-and-using-an-attribute-stored-in-variable-using-beautifulsoup-4 - JinSnow

3
我认为你只需要在这里添加一个星号:
body = soup.find(*atrs)

没有星号,你将传递一个元组作为单一参数:
body = soup.find(('div' , {'id':'body'}))

使用星号操作符,元组会被展开,语句就变成了你想要的等价形式:

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

有关使用*args标记以及相关的**kwargs,请参见此文章获得更多信息。


1
++,这是一个不错的选择。 - Eli Bendersky
谢谢提供链接,我正在阅读。 顺便说一下,我不得不在参数列表和soup.find位置上都添加了两个星号。 - scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接