2011-03-11 40 views
15

tengo el siguiente código HTML que está dentro de un documento más grandeBeautifulSoup para extraer el texto entre los saltos de línea (por ejemplo, <br /> etiquetas)

<br /> 
Important Text 1 
<br /> 
<br /> 
Not Important Text 
<br /> 
Important Text 2 
<br /> 
Important Text 3 
<br /> 
<br /> 
Non Important Text 
<br /> 
Important Text 4 
<br /> 

Actualmente estoy usando BeautifulSoup para obtener otros elementos dentro del HTML, pero no han podido encontrar una forma de obtener las líneas de texto importantes entre las etiquetas <br />. Puedo aislar y navegar a cada uno de los elementos <br />, pero no puedo encontrar la manera de obtener el texto intermedio. Cualquier ayuda sería muy apreciada. Gracias.

Respuesta

21

Si lo que desea es cualquier texto que se encuentra entre dos <br /> etiquetas, se puede hacer algo como lo siguiente:

from BeautifulSoup import BeautifulSoup, NavigableString, Tag 

input = '''<br /> 
Important Text 1 
<br /> 
<br /> 
Not Important Text 
<br /> 
Important Text 2 
<br /> 
Important Text 3 
<br /> 
<br /> 
Non Important Text 
<br /> 
Important Text 4 
<br />''' 

soup = BeautifulSoup(input) 

for br in soup.findAll('br'): 
    next_s = br.nextSibling 
    if not (next_s and isinstance(next_s,NavigableString)): 
     continue 
    next2_s = next_s.nextSibling 
    if next2_s and isinstance(next2_s,Tag) and next2_s.name == 'br': 
     text = str(next_s).strip() 
     if text: 
      print "Found:", next_s 

Pero tal vez me malinterprete su pregunta? Su descripción del problema no parece coincidir con la "importante"/"no importante" en los datos de su ejemplo, así que me he ido con la descripción;)

+0

Ahh, el problema era que estaba usando findNextSibling(), y que fue simplemente pasando por alto el texto e ir al siguiente salto de línea. Usando nextSibling funcionó. ¡Gracias por la ayuda! – maltman

+0

¡Gran respuesta, esto me salvó un montón de dolor de cabeza! – Nick

+0

¿'next' no es una palabra reservada en Python? Tal vez un nombre de variable diferente sería mejor? (Este es un punto menor, pero tales cosas se suman!) – duhaime

4

Por lo tanto, para fines de prueba, supongamos que este fragmento de HTML está dentro de una etiqueta span:

x = """<span><br /> 
Important Text 1 
<br /> 
<br /> 
Not Important Text 
<br /> 
Important Text 2 
<br /> 
Important Text 3 
<br /> 
<br /> 
Non Important Text 
<br /> 
Important Text 4 
<br /></span>""" 

Ahora voy a analizar y encontrar mi etiqueta span:

from BeautifulSoup import BeautifulSoup 
y = soup.find('span') 

Si iterar sobre el generador en y.childGenerator(), obtendrá tanto el br's como el texto:

In [4]: for a in y.childGenerator(): print type(a), str(a) 
    ....: 
<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 
Important Text 1 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 
Not Important Text 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 
Important Text 2 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 
Important Text 3 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 
Non Important Text 

<type 'instance'> <br /> 
<class 'BeautifulSoup.NavigableString'> 
Important Text 4 

<type 'instance'> <br /> 
0

Los siguientes trabajó para mí:

for br in soup.findAll('br'): 
    if str(type(br.contents[0])) == '<class \'BeautifulSoup.NavigableString\'>': 
     print br.contents[0] 
+0

No confíe en la representación de cadenas de objetos para la lógica de su código. – Sylvain

Cuestiones relacionadas