Cómo analizar archivos XML usando Beautifulsoup de Python

Cómo analizar archivos XML usando Beautifulsoup de Python

Los datos están literalmente en todas partes, en todo tipo de documentos. Pero no todo es útil, de ahí la necesidad de analizarlo para obtener las partes que se necesitan. Los documentos XML son uno de esos documentos que contienen datos. Son muy similares a los archivos HTML, ya que tienen casi el mismo tipo de estructura. Por lo tanto, deberá analizarlos para obtener información vital, tal como lo haría cuando trabaje con HTML.Hay dos aspectos principales para analizar archivos XML. Ellos son:

  • Encontrar etiquetas
  • Extracción de las etiquetas

Deberá encontrar la etiqueta que contenga la información que desea, luego extraer esa información. Aprenderá cómo hacer ambas cosas cuando trabaje con archivos XML antes del final de este artículo.

Instalación

BeautifulSoup es una de las bibliotecas más utilizadas cuando se trata de rasparse web con Python. Dado que los archivos XML son similares a los archivos HTML, también es capaz de analizarlos. Sin embargo, para analizar archivos XML usando BeautifulSoup, es mejor que utilice Python's lxml pasador.

Puede instalar ambas bibliotecas utilizando el pepita Herramienta de instalación, a través del siguiente comando:

PIP install BS4 LXML

Para confirmar que ambas bibliotecas se instalan correctamente, puede activar el shell interactivo e intentar importar ambos. Si no aparece ningún error, entonces está listo para ir con el resto del artículo.

Aquí hay un ejemplo:

$ Python
Python 3.7.4 (etiquetas/v3.7.4: E09359112e, 8 de julio de 2019, 20:34:20)
[MSC V.1916 64 bit (amd64)] en win32
Escriba "Ayuda", "Copyright", "Créditos" o "Licencia" para obtener más información.
>>> importar BS4
>>> importar lxml
>>>

Antes de continuar, debe crear un archivo XML desde el fragmento de código a continuación. Es bastante simple y debe adaptarse a los casos de uso que aprenderá en el resto del artículo. Simplemente copie, pegue en su editor y guarde; un nombre como muestra.xml debería ser suficiente.



El árbol

Primero
Segundo

Tercero

Uno
Dos
Mellizos


Cuatro

Ahora, en tu guión de Python; Deberá leer el archivo XML como un archivo normal, luego pasarlo a BeautifulSoup. El resto de este artículo utilizará el bs_content variable, por lo que es importante que das este paso.

# Importar beautifulsoup
de bs4 import beautifulsoup como BS
contenido = []
# Lea el archivo XML
con abierto ("Muestra.xml "," r ") como archivo:
# Lea cada línea en el archivo, ReadLines () devuelve una lista de líneas
contenido = archivo.ReadLines ()
# Combinar las líneas en la lista en una cadena
content = "".unirse (contenido)
bs_content = bs (contenido, "lxml")

La muestra de código anterior importaciones Beautifulsoup, Luego lee el archivo XML como un archivo normal. Después de eso, pasa el contenido al importado Beautifulsoup Biblioteca y el analizador de elección.

Notarás que el código no importa lxml. No tiene que hacerlo como Beautifulsoup elegirá el lxml analizador "LXML" en el objeto.

Ahora, puede continuar con el resto del artículo.

Encontrar etiquetas

Una de las etapas más importantes de los archivos XML de análisis es buscar etiquetas. Hay varias formas de hacerlo cuando se usa BeautifulSoup; Por lo tanto, debe saber sobre un puñado de ellos para tener las mejores herramientas para la situación apropiada.

Puede encontrar etiquetas en documentos XML por:

  • Nombres
  • Relaciones

Encontrar etiquetas por nombres

Hay dos métodos hermosos que puede usar al encontrar etiquetas por nombres. Sin embargo, los casos de uso difieren; Echemos un vistazo a ellos.

encontrar

De la experiencia personal, usará el encontrar método con mayor frecuencia que los otros métodos para encontrar etiquetas en este artículo. La etiqueta Find recibe el nombre de la etiqueta que desea obtener, y devuelve un objeto BeautifulSoup de la etiqueta si encuentra uno; más, regresa Ninguno.

Aquí hay un ejemplo:

>>> resultado = bs_content.encontrar ("datos")
>>> Imprimir (resultado)
Uno
>>> resultado = bs_content.encontrar ("único")
>>> Imprimir (resultado)
Mellizos
>>> resultado = bs_content.encontrar ("padre")
>>> Imprimir (resultado)
Ninguno
>>> resultado = bs_content.encontrar ("madre")
>>> Imprimir (resultado)
Ninguno

Si echas un vistazo al ejemplo, verás que el encontrar El método devuelve una etiqueta si coincide con el nombre, de lo contrario no devuelve ninguno. Sin embargo, si lo mira más de cerca, verá que solo devuelve una sola etiqueta.

Por ejemplo, cuando encontrar ("datos") se llamó, solo devolvió la primera etiqueta de datos, pero no devolvió las otras.

ENTENDIDO: El encontrar El método solo devolverá la primera etiqueta que coincide con su consulta.

Entonces, ¿cómo puedes encontrar otras etiquetas también?? Eso nos lleva al siguiente método.

encuentra todos

El encuentra todos El método es bastante similar al encontrar método. La única diferencia es que devuelve una lista de etiquetas que coinciden con su consulta. Cuando no encuentra ninguna etiqueta, simplemente devuelve una lista vacía. Por eso, encuentra todos siempre devolverá una lista.

Aquí hay un ejemplo:

>>> resultado = bs_content.find_all ("datos")
>>> Imprimir (resultado)
[Uno, Dos]
>>> resultado = bs_content.find_all ("niño")
>>> Imprimir (resultado)
[Primero, Segundo,
Tercero

Uno
Dos
Mellizos

,
Cuatro]
>>> resultado = bs_content.find_all ("padre")
>>> imprimir (resultado
[]
>>> resultado = bs_content.find_all ("madre")
>>> Imprimir (resultado)
[]

Ahora que sabes cómo usar el encontrar y encuentra todos Métodos, puede buscar etiquetas en cualquier parte del documento XML. Sin embargo, puede hacer que sus búsquedas sean más potentes.

Así es cómo:

Algunas etiquetas pueden tener el mismo nombre, pero diferentes atributos. Por ejemplo, el niño Las etiquetas tienen un nombre atributo y diferentes valores. Puede realizar búsquedas específicas basadas en esas.

Echa un vistazo a esto:

>>> resultado = bs_content.encontrar ("niño", "nombre": "rosa")
>>> Imprimir (resultado)
Segundo
>>> resultado = bs_content.find_all ("niño", "nombre": "rosa")
>>> Imprimir (resultado)
[Segundo]
>>> resultado = bs_content.encontrar ("niño", "nombre": "Jack")
>>> Imprimir (resultado)
Primero
>>> resultado = bs_content.find_all ("niño", "nombre": "Jack")
>>> Imprimir (resultado)
[Primero]

Verás que hay algo diferente en el uso del encontrar y encuentra todos Métodos aquí: ambos tienen un segundo parámetro.

Cuando pasa en un diccionario como segundo parámetro, el encontrar y encuentra todos Los métodos además de su búsqueda para obtener etiquetas que tengan atributos y valores que se ajusten a la clave proporcionada: Par de valores.

Por ejemplo, a pesar de usar el encontrar Método En el primer ejemplo, devolvió el segundo niño etiqueta (en lugar de la primera niño etiqueta), porque esa es la primera etiqueta que coincide con la consulta. El encuentra todos La etiqueta sigue el mismo principio, excepto que devuelve todas las etiquetas que coinciden con la consulta, no solo la primera.

Encontrar etiquetas por relaciones

Si bien es menos popular que la búsqueda por nombres de etiquetas, también puede buscar etiquetas por relaciones. Sin embargo, en el sentido real, es más navegador que buscar.

Hay tres relaciones clave en los documentos XML:

  • Padre: La etiqueta en la que existe la etiqueta de referencia.
  • Niños: Las etiquetas que existen en la etiqueta de referencia.
  • Hermanos: Las etiquetas que existen en el mismo nivel que la etiqueta de referencia.

De la explicación anterior, puede inferir que la etiqueta de referencia es el factor más importante para buscar etiquetas por relaciones. Por lo tanto, busquemos la etiqueta de referencia y continuemos el artículo.

Mira esto:

>>> Third_child = BS_Content.Find ("Child", "Nombre": "Blue Ivy")
>>> Imprimir (Third_Child)

Tercero

Uno
Dos
Mellizos

De la muestra de código anterior, la etiqueta de referencia para el resto de esta sección será la tercera niño etiqueta, almacenada en un Third_child variable. En las subsecciones a continuación, verá cómo buscar etiquetas basadas en la relación de sus padres, hermanos e hijos con la etiqueta de referencia.

Encontrar padres

Para encontrar la etiqueta principal de una etiqueta de referencia, utilizará el padre atributo. Hacer esto devuelve la etiqueta principal, así como las etiquetas debajo. Este comportamiento es bastante comprensible, ya que las etiquetas de los niños son parte de la etiqueta principal.

Aquí hay un ejemplo:

>>> resultado = tercero_child.padre
>>> Imprimir (resultado)

Primero
Segundo

Tercero

Uno
Dos
Mellizos


Cuatro

Encontrar hijos

Para encontrar las etiquetas de los niños de una etiqueta de referencia, utilizará el niños atributo. Hacer esto devuelve las etiquetas de los niños, así como las sub-etiquetas debajo de cada una de ellas. Este comportamiento también es comprensible, ya que las etiquetas de los niños a menudo también tienen sus propias etiquetas.

Una cosa que debes tener en cuenta es que el niños El atributo devuelve las etiquetas de los niños como generador. Entonces, si necesita una lista de las etiquetas de los niños, tendrá que convertir el generador en una lista.

Aquí hay un ejemplo:

>>> resultado = list (tercero_child.niños)
>>> Imprimir (resultado)
['\ n tercero \ n',
Uno
Dos
Mellizos
, '\norte']

Si observa más de cerca el ejemplo anterior, notará que algunos valores en la lista no son etiquetas. Eso es algo que debes tener en cuenta.

ENTENDIDO: El niños El atributo no solo devuelve las etiquetas de los niños, sino que también devuelve el texto en la etiqueta de referencia.

Encontrar hermanos

El último en esta sección es encontrar etiquetas que son hermanos a la etiqueta de referencia. Para cada etiqueta de referencia, puede haber etiquetas de hermanos antes y después. El anterior_siblings El atributo devolverá las etiquetas de hermanos antes de la etiqueta de referencia y el Next_siblings El atributo devolverá las etiquetas de hermanos después de él.

Al igual que el niños atributo, el anterior_siblings y Next_siblings Los atributos devolverán los generadores. Por lo tanto, debe convertirse en una lista si necesita una lista de hermanos.

Mira esto:

>>> anterior_siblings = list (tercero_child.anterior_siblings)
>>> imprimir (anterior_siblings)
['\norte', Segundo, '\norte',
Primero, '\norte']
>>> next_siblings = list (tercero_child.Next_siblings)
>>> Imprimir (Next_siblings)
['\norte', Cuatro]
>>> imprimir (anterior_siblings + next_siblings)
['\norte', Segundo, '\norte', Primero,
'\ n', '\ n', Cuatro, '\norte']

El primer ejemplo muestra a los hermanos anteriores, el segundo muestra a los siguientes hermanos; entonces ambos resultados se combinan para generar una lista de todos los hermanos para la etiqueta de referencia.

Extracción de las etiquetas

Al analizar los documentos XML, gran parte del trabajo radica en encontrar las etiquetas correctas. Sin embargo, cuando los encuentre, también puede extraer cierta información de esas etiquetas, y eso es lo que esta sección le enseñará.

Verá cómo extraer lo siguiente:

  • Valores de atributo de etiqueta
  • Texto de etiqueta
  • Contenido de etiqueta

Extracción de valores de atributo de etiqueta

A veces, puede tener una razón para extraer los valores de los atributos en una etiqueta. En el siguiente emparejamiento de valor de atributo, por ejemplo: nombre = "Rose", Es posible que desee extraer "Rose."

Para hacer esto, puede usar el conseguir método, o acceder al nombre del atributo usando [] Como un índice, tal como lo haría cuando trabaje con un diccionario.

Aquí hay un ejemplo:

>>> resultado = tercero_child.Get ("Nombre")
>>> Imprimir (resultado)
Hiedra azul
>>> resultado = tercero_child ["Nombre"]
>>> Imprimir (resultado)
Hiedra azul

Extracción del texto de la etiqueta

Cuando desee acceder a los valores de texto de una etiqueta, puede usar el texto o instrumentos de cuerda atributo. Ambos devolverán el texto en una etiqueta, e incluso las etiquetas de los niños. sin embargo, el texto El atributo los devolverá como una sola cadena, concatenada; mientras que la instrumentos de cuerda El atributo los devolverá como un generador que puede convertir a una lista.

Aquí hay un ejemplo:

>>> resultado = tercero_child.texto
>>> Imprimir (resultado)
'\ n Third \ n \ none \ ntwo \ ntwins \ n \ n'
>>> resultado = list (tercero_child.instrumentos de cuerda)
>>> Imprimir (resultado)
['\ n tercero \ n', '\ n', 'one', '\ n', 'dos', '\ n', 'gemelos', '\ n', '\ n']

Extraer contenido de etiqueta

ASIDOS extrayendo los valores de atributo y el texto de la etiqueta, también puede extraer todo un contenido de etiquetas. Para hacer esto, puedes usar el contenido atributo; es un poco similar al niños atributo y producirá los mismos resultados. Sin embargo, mientras el niños El atributo devuelve un generador, el contenido El atributo devuelve una lista.

Aquí hay un ejemplo:

>>> resultado = tercero_child.contenido
>>> Imprimir (resultado)
['\ n tercero \ n',
Uno
Dos
Mellizos
, '\norte']

Impresión hermosa

Hasta ahora, ha visto algunos métodos y atributos importantes que son útiles al analizar los documentos XML que usan BeautifulSoup. Pero si nota, cuando imprime las etiquetas en la pantalla, tienen algún tipo de aspecto agrupado. Si bien la apariencia puede no tener un impacto directo en su productividad, puede ayudarlo a analizar de manera más efectiva y hacer que el trabajo sea menos tedioso.

Aquí hay un ejemplo de imprimir de la manera normal:

>>> Imprimir (Third_Child)

Tercero

Uno
Dos
Mellizos

Sin embargo, puede mejorar su apariencia utilizando el embellecer método. Simplemente llame al embellecer Método en la etiqueta mientras se imprime, y obtendrá algo visualmente agradable.

Mira esto:

Conclusión

El análisis de los documentos es un aspecto importante del abastecimiento de datos. Los documentos XML son bastante populares, y espero que esté mejor equipado para tomarlos y extraer los datos que desea.

De este artículo, ahora puedes:

  • buscar etiquetas por nombres o relaciones
  • extraer datos de las etiquetas

Si te sientes bastante perdido y eres bastante nuevo en la biblioteca de Beautifulsoup, puedes ver el tutorial de BeautifulSoup para principiantes.