2010-04-03 14 views
5

J'ai ce code qui va chercher un texte à partir d'une page à l'aide BeautifulSoupPython belle arguments de soupe

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

Je voudrais faire cela en fonction réutilisable qui prend dans certains htmlText et les balises pour le match comme suivant

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

Mais si je fais un appel comme celui-ci

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

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

Je ne reçois que l'élément div, l'attribut body semble ignoré.

Y at-il un moyen de résoudre ce problème?

Répondre

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

Et puis:

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

Merci pour votre réponse, cela a fonctionné. Je ne savais pas que l'on pouvait décompresser les listes en utilisant *, pensant que seuls les dicts fonctionnaient comme ça en utilisant * \ *. – scott

+0

@scott: lire l'article Mark lié à dans sa réponse –

+0

@EliBendersky Great! Mais aucune idée comment nous pourrions déballer une seule clé de dictionnaire (comme "class" dans 'del tag [" class "]')? http://stackoverflow.com/questions/41792761/calling-and-using-an-attribute-stored-in-variable-using-beautifulsoup-4 – JinSnow

3

Je pense que vous avez juste besoin d'ajouter un astérisque ici:

body = soup.find(*atrs) 

Sans l'astérisque vous passez un seul paramètre qui est un tuple:

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

Avec l'astérisque tuple est élargi et l'instruction devient équivalente à ce que vous voulez:

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

Voir this article pour plus d'informations sur l'utilisation de la notation *args, et la **kwargs associée.

+1

++, ceci est une bonne alternative. –

+0

Merci pour le lien, je suis en train de le lire dès maintenant. btw J'ai dû ajouter deux astérisques à la fois dans la liste des paramètres et dans l'espace soup.find. – scott