Hermosa Sopa

Cómo analizar archivos XML con BeautifulSoup de Python

Cómo analizar archivos XML con 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 trabaja con HTML.

Hay dos aspectos principales para analizar archivos XML. Ellos son:

Deberá encontrar la etiqueta que contiene la información que desea y luego extraer esa información. Aprenderá a 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 web scraping 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 con BeautifulSoup, es mejor que utilice Python lxml analizador.

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

pip instalar bs4 lxml

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

He aquí 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", "derechos de autor", "créditos" o "licencia" para obtener más información.
>>> importar bs4
>>> importar lxml
>>>

Antes de continuar, debe crear un archivo XML a partir del fragmento de código a continuación. Es bastante simple y debería adaptarse a los casos de uso que conocerá 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 su secuencia de comandos de Python; deberá leer el archivo XML como un archivo normal y luego pasarlo a BeautifulSoup. El resto de este artículo hará uso de la bs_content variable, por lo que es importante que des este paso.

# Importar BeautifulSoup
desde bs4 importar BeautifulSoup como bs
contenido = []
# Leer el archivo XML
con open ("muestra.xml "," r ") como archivo:
# Leer cada línea en el archivo, readlines () devuelve una lista de líneas
contenido = archivo.readlines ()
# Combina las líneas de la lista en una cadena
contenido = "".unirse (contenido)
bs_content = bs (contenido, "lxml")

El ejemplo de código anterior importa Hermosa Sopa, luego lee el archivo XML como un archivo normal. Después de eso, pasa el contenido al archivo importado Hermosa Sopa biblioteca, así como el analizador de su elección.

Notarás que el código no se importa lxml. No tiene que ser tan Hermosa Sopa elegirá el lxml analizador como resultado de pasar "Lxml" en el objeto.

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

Encontrar etiquetas

Una de las etapas más importantes del análisis de archivos XML es la búsqueda de etiquetas. Hay varias formas de hacer esto cuando se usa BeautifulSoup; por lo que necesita conocer algunos de ellos para tener las mejores herramientas para la situación adecuada.

Puede encontrar etiquetas en documentos XML mediante:

Búsqueda de etiquetas por nombres

Hay dos métodos de BeautifulSoup que puede utilizar al buscar etiquetas por nombre. Sin embargo, los casos de uso difieren; echemos un vistazo a ellos.

encontrar

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

He aquí un ejemplo:

>>> resultado = bs_content.buscar ("datos")
>>> imprimir (resultado)
Uno
>>> resultado = bs_content.buscar ("ú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, devuelve Ninguno. Sin embargo, si lo observa más de cerca, verá que solo devuelve una sola etiqueta.

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

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

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

encuentra todos

La 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.

He aquí 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 sabe cómo utilizar el encontrar y encuentra todos métodos, puede buscar etiquetas en cualquier lugar 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 esos.

Echa un vistazo a esto:

>>> resultado = bs_content.buscar ("niño", "nombre": "Rosa")
>>> imprimir (resultado)
Segundo
>>> resultado = bs_content.find_all ("niño", "nombre": "Rosa")
>>> imprimir (resultado)
[Segundo]
>>> resultado = bs_content.buscar ("niño", "nombre": "Jack")
>>> imprimir (resultado)
Primero
>>> resultado = bs_content.find_all ("niño", "nombre": "Jack")
>>> imprimir (resultado)
[Primero]

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

Cuando pasa un diccionario como segundo parámetro, el encontrar y encuentra todos Los métodos amplían su búsqueda para obtener etiquetas que tengan atributos y valores que se ajusten al par clave: valor proporcionado.

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. La encuentra todos sigue el mismo principio, excepto que devuelve todas las etiquetas que coinciden con la consulta, no solo la primera.

Encontrar etiquetas por relaciones

Aunque es menos popular que buscar por nombre de etiqueta, también puede buscar etiquetas por relaciones. Sin embargo, en el sentido real, se trata más de navegar que de buscar.

Hay tres relaciones clave en los documentos XML:

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

Mira esto:

>>> tercer_hijo = bs_content.buscar ("niño", "nombre": "Blue Ivy")
>>> imprimir (tercer_hijo)

Tercero

Uno
Dos
mellizos

Del ejemplo de código anterior, la etiqueta de referencia para el resto de esta sección será la tercera niño etiqueta, almacenada en una tercer_hijo variable. En las subsecciones siguientes, verá cómo buscar etiquetas en función de la relación de padres, hermanos e hijos con la etiqueta de referencia.

Encontrar padres

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

He aquí un ejemplo:

>>> resultado = tercer_hijo.padre
>>> imprimir (resultado)

Primero
Segundo

Tercero

Uno
Dos
mellizos


Cuatro

Encontrar niños

Para encontrar las etiquetas secundarias de una etiqueta de referencia, utilizará la niños atributo. Al hacer esto, se devuelven las etiquetas secundarias, así como las subetiquetas debajo de cada una de ellas. Este comportamiento también es comprensible, ya que las etiquetas secundarias a menudo también tienen sus propias etiquetas secundarias.

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

He aquí un ejemplo:

>>> resultado = lista (tercer_hijo.niños)
>>> imprimir (resultado)
['\ n Tercero \ n',
Uno
Dos
mellizos
, '\norte']

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

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

Encontrar hermanos

Lo último en esta sección es encontrar etiquetas que sean hermanas de la etiqueta de referencia. Para cada etiqueta de referencia, puede haber etiquetas de hermanos antes y después de ella. La hermanos_previos El atributo devolverá las etiquetas del hermano antes de la etiqueta de referencia, y el hermanos_siguiente El atributo devolverá las etiquetas de hermanos después de él.

Como el niños atributo, el hermanos_previos y próximos_hermanos los atributos devolverán generadores. Por lo tanto, debe convertir a una lista si necesita una lista de hermanos.

Mira esto:

>>> hermanos_anteriores = lista (tercer_hijo.hermanos_previos)
>>> imprimir (hermanos_anteriores)
['\norte', Segundo, '\norte',
Primero, '\norte']
>>> siguientes_hermanos = lista (tercer_hijo.próximos_hermanos)
>>> imprimir (próximos_hermanos)
['\norte', Cuatro]
>>> imprimir (hermanos_anteriores + hermanos_siguientes)
['\norte', Segundo, '\norte', Primero,
'\ n', '\ n', Cuatro, '\norte']

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

Extracción de etiquetas

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

Verá cómo extraer lo siguiente:

Extracción de valores de atributos de etiquetas

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

Para hacer esto, puede hacer uso de la obtener método, o acceder al nombre del atributo usando [] como un índice, como lo haría cuando trabaja con un diccionario.

He aquí un ejemplo:

>>> resultado = tercer_hijo.get ("nombre")
>>> imprimir (resultado)
Hiedra azul
>>> resultado = tercer_niño ["nombre"]
>>> imprimir (resultado)
Hiedra azul

Extracción de texto de etiqueta

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

He aquí un ejemplo:

>>> resultado = tercer_hijo.texto
>>> imprimir (resultado)
'\ n Tercero \ n \ nUno \ nDos \ nGemelos \ n \ n'
>>> resultado = lista (tercer_hijo.instrumentos de cuerda)
>>> imprimir (resultado)
['\ n Tercero \ n', '\ n', 'Uno', '\ n', 'Dos', '\ n', 'Gemelos', '\ n', '\ n']

Extracción del contenido de la etiqueta

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

He aquí un ejemplo:

>>> resultado = tercer_hijo.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 documentos XML con BeautifulSoup. Pero si nota, cuando imprime las etiquetas en la pantalla, tienen algún tipo de apariencia agrupada. 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.

A continuación, se muestra un ejemplo de impresión de la forma normal:

>>> imprimir (tercer_hijo)

Tercero

Uno
Dos
mellizos

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

Mira esto:

Conclusión

Analizar documentos es un aspecto importante del abastecimiento de datos. Los documentos XML son bastante populares y, con suerte, estará mejor equipado para aceptarlos y extraer los datos que desee.

A partir de este artículo, ahora puede:

Si se siente bastante perdido y es bastante nuevo en la biblioteca de BeautifulSoup, puede consultar el tutorial de BeautifulSoup para principiantes.

Cómo instalar League Of Legends en Ubuntu 14.04
Si eres fanático de League of Legends, esta es una oportunidad para que pruebes League of Legends. Tenga en cuenta que LOL es compatible con PlayOnLin...
Instale el último juego de estrategia de OpenRA en Ubuntu Linux
OpenRA es un motor de juego de estrategia en tiempo real libre / gratuito que recrea los primeros juegos de Westwood como el clásico Command & Conquer...
Instale el último emulador de Dolphin para Gamecube y Wii en Linux
Dolphin Emulator te permite jugar los juegos de Gamecube y Wii que elijas en computadoras personales con Linux (PC). Al ser un emulador de juegos de ...