2010-04-03 9 views
5

tengo este código que recupera un texto de una página utilizando BeautifulSoupPython argumentos hermosa sopa

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

Me gustaría hacer esto como una función reutilizable que lleva en algunos htmlText y las etiquetas para que coincida con ella como la tras

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

Pero si hago una llamada como ésta

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

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

consigo únicamente el elemento div, el atributo del cuerpo parece ser ignorado.

¿Hay alguna manera de arreglar esto?

Respuesta

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

Y luego:

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

Gracias por su respuesta, funcionó. No sabía que se podían descomprimir listas usando *, pensé que solo los dicts funcionaban así usando * \ *. – scott

+0

@scott: lea el artículo Marcado vinculado en su respuesta –

+0

@EliBendersky ¡Genial! ¿Pero alguna idea de cómo podríamos descomprimir una sola clave de diccionario (como "clase" en 'del tag [" clase "]')? http://stackoverflow.com/questions/41792761/calling-and-using-an-attribute-stored-in-variable-using-beautifulsoup-4 – JinSnow

3

creo que sólo tiene que añadir un asterisco aquí:

body = soup.find(*atrs) 

Sin el asterisco está de paso un único parámetro que es una tupla:

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

Con el asterisco se expande la tupla y la declaración se vuelve equivalente a lo que desea:

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

See this article para obtener más información sobre el uso de la notación *args, y la relacionada **kwargs.

+1

++, esta es una buena alternativa. –

+0

Gracias por el enlace, lo estoy leyendo ahora mismo. por cierto, tuve que agregar dos asteriscos tanto en la lista de parámetros como en el lugar de soup.find. – scott

Cuestiones relacionadas