¿Cómo se obtiene el texto de una 'celda de datos' HTML usando BeautifulSoup?
-
03-07-2019 - |
Pregunta
He estado tratando de eliminar algunos datos de los archivos HTML. Tengo la lógica codificada para obtener las celdas correctas. Ahora estoy luchando por obtener el contenido real de la 'celda':
aquí está mi recorte htm
headerRows [0] [10] .contents
[<font size="+0"><font face="serif" size="1"><b>Apples Produced</b><font size="3">
</font></font></font>]
Tenga en cuenta que este es un elemento de la lista de Python [].
Necesito el valor de Manzanas producidas pero no puedo acceder a él.
Cualquier sugerencia sería apreciada
Sugerencias sobre un buen libro que explica que esto me ganaría mi eterna gratitud
Gracias por esa respuesta. Sin embargo, no hay una respuesta más general. ¿Qué sucede si mi celda no tiene un atributo en negrita?
decir que es:
[<font size="+0"><font face="serif" size="1"><I>Apples Produced</I><font size="3">
</font></font></font>]
Manzanas producidas
Estoy tratando de aprender a leer / comprender la documentación y su respuesta ayudará
Realmente aprecio esta ayuda. Lo mejor de estas respuestas es que es mucho más fácil generalizar a partir de ellas que lo que he podido hacer desde la documentación de BeautifulSoup. Aprendí a programar en la era de Fortran y mientras disfruto aprendiendo Python y estoy asombrado de su poder, BeautifulSoup es un ejemplo. hacer un cohernet con toda la documentación es difícil para mí.
Saludos
Solución
headerRows[0][10].contents[0].find('b').string
Otros consejos
La la documentación de BeautifulSoup debe cubrir todo lo que necesita, en este caso, parece que quieres usar findNext
:
headerRows[0][10].findNext('b').string
Una solución más genérica que no se basa en la etiqueta <b>
sería utilizar argumento de texto a findAll
, que le permite buscar solo NavigableString
objetos:
>>> s = BeautifulSoup(u'<p>Test 1 <span>More</span> Test 2</p>')
>>> u''.join([s.string for s in s.findAll(text=True)])
u'Test 1 More Test 2'
Tengo una clase base en la que extiendo todas las clases de Beautiful Soup con un montón de métodos que me ayudan a llegar al texto dentro de un grupo de elementos en los que no quiero confiar necesariamente en la estructura. Uno de esos métodos es el siguiente:
def clean(self, val):
if type(val) is not StringType: val = str(val)
val = re.sub(r'<.*?>', '', s) #remove tags
val = re.sub("\s+" , " ", val) #collapse internal whitespace
return val.strip() #remove leading & trailing whitespace