Comment analyser les fichiers XML à l'aide de BeautifulSoup de Python

Comment analyser les fichiers XML à l'aide de BeautifulSoup de Python

Les données sont littéralement partout, dans toutes sortes de documents. Mais tout n'est pas utile, d'où la nécessité de l'analyser pour obtenir les pièces nécessaires. Les documents XML sont l'un de ces documents qui détiennent des données. Ils sont très similaires aux fichiers HTML, car ils ont presque le même type de structure. Par conséquent, vous devrez les analyser pour obtenir des informations vitales, tout comme vous le feriez lorsque vous travaillez avec HTML.Il y a deux aspects majeurs pour analyser les fichiers XML. Ils sont:

  • Trouver des balises
  • Extraction des balises

Vous devrez trouver la balise qui contient les informations que vous souhaitez, puis extraire ces informations. Vous apprendrez à faire les deux lorsque vous travaillez avec des fichiers XML avant la fin de cet article.

Installation

BeautifulSoup est l'une des bibliothèques les plus utilisées en ce qui concerne le grattage Web avec Python. Étant donné que les fichiers XML sont similaires aux fichiers HTML, il est également capable de les analyser. Pour analyser les fichiers XML en utilisant BeautifulSoup, il est préférable que vous utilisiez lxml analyseur.

Vous pouvez installer les deux bibliothèques en utilisant pépin Outil d'installation, via la commande ci-dessous:

pip install bs4 lxml

Pour confirmer que les deux bibliothèques sont installées avec succès, vous pouvez activer le shell interactif et essayer d'importer les deux. Si aucune erreur n'apparaît, alors vous êtes prêt à aller avec le reste de l'article.

Voici un exemple:

$ python
Python 3.7.4 (Tags / V3.7.4: E09359112E, 8 juillet 2019, 20:34:20)
[MSC V.1916 64 bits (AMD64)] sur Win32
Tapez "Help", "Copyright", "Crédits" ou "Licence" pour plus d'informations.
>>> Importer BS4
>>> Importer LXML
>>>

Avant de continuer, vous devez créer un fichier XML à partir de l'extrait de code ci-dessous. C'est assez simple et devrait convenir aux cas d'utilisation que vous apprendrez dans le reste de l'article. Copiez simplement, collez dans votre éditeur et enregistrez; Un nom comme goûter.xml devrait suffire.



L'arbre

D'abord
Deuxième

Troisième

Un
Deux
Jumeaux


Quatrième

Maintenant, dans votre script Python; Vous devrez lire le fichier XML comme un fichier normal, puis le passer dans BeautifulSoup. Le reste de cet article utilisera le BS_Content variable, il est donc important de faire cette étape.

# Import BeautifulSoup
De BS4 Import BeautifulSoup comme BS
contenu = []
# Lisez le fichier XML
avec ouvert ("".xml "," r ") comme fichier:
# Lire chaque ligne dans le fichier, readlines () renvoie une liste de lignes
contenu = fichier.LEADLINES ()
# Combinez les lignes de la liste en une chaîne
content = "".rejoindre (contenu)
bs_content = bs (contenu, "lxml")

L'échantillon de code ci-dessus importations BelSoup, Ensuite, il lit le fichier XML comme un fichier régulier. Après cela, il passe le contenu dans le BelSoup bibliothèque ainsi que l'analyseur de choix.

Vous remarquerez que le code n'importe pas lxml. Il n'a pas à faire BelSoup choisira le lxml analyseur à la suite du passage «LXML» dans l'objet.

Maintenant, vous pouvez procéder avec le reste de l'article.

Trouver des balises

L'une des étapes les plus importantes de l'analyse des fichiers XML est la recherche de balises. Il existe différentes façons de procéder lors de l'utilisation de BeautifulSoup; Vous devez donc connaître une poignée d'entre eux pour avoir les meilleurs outils pour la situation appropriée.

Vous pouvez trouver des balises dans des documents XML par:

  • Des noms
  • Des relations

Trouver des balises par des noms

Il existe deux méthodes belles que vous pouvez utiliser lors de la recherche de balises par des noms. Cependant, les cas d'utilisation diffèrent; Jetons-les.

trouver

D'après l'expérience personnelle, vous utiliserez le trouver Méthode plus souvent que les autres méthodes pour trouver des balises dans cet article. La balise Find reçoit le nom de la balise que vous souhaitez obtenir, et renvoie un objet BeautifulSoup de la balise s'il en trouve un; Sinon, ça revient Aucun.

Voici un exemple:

>>> résultat = bs_content.trouver ("données")
>>> imprimer (résultat)
Un
>>> résultat = bs_content.trouver ("unique")
>>> imprimer (résultat)
Jumeaux
>>> résultat = bs_content.trouver ("père")
>>> imprimer (résultat)
Aucun
>>> résultat = bs_content.trouver ("mère")
>>> imprimer (résultat)
Aucun

Si vous jetez un œil à l'exemple, vous verrez que le trouver La méthode renvoie une balise si elle correspond au nom, sinon il ne renvoie aucun. Cependant, si vous y regardez de plus près, vous ne verrez qu'il ne renvoie qu'une seule balise.

Par exemple, quand trouver («données») a été appelé, il n'a renvoyé que la première balise de données, mais n'a pas renvoyé les autres.

JE T'AI EU: Le trouver La méthode ne renvoie que la première balise qui correspond à sa requête.

Alors comment trouver aussi d'autres balises? Cela nous conduit à la méthode suivante.

Trouver tout

Le Trouver tout la méthode est assez similaire à la trouver méthode. La seule différence est qu'il renvoie une liste de balises qui correspondent à sa requête. Quand il ne trouve aucune balise, il renvoie simplement une liste vide. Ainsi, Trouver tout retournera toujours une liste.

Voici un exemple:

>>> résultat = bs_content.find_all ("data")
>>> imprimer (résultat)
[Un, Deux]]
>>> résultat = bs_content.find_all ("enfant")
>>> imprimer (résultat)
[D'abord, Deuxième,
Troisième

Un
Deux
Jumeaux

,
Quatrième]]
>>> résultat = bs_content.find_all ("père")
>>> imprimer (résultat
[]
>>> résultat = bs_content.find_all ("mère")
>>> imprimer (résultat)
[]

Maintenant que vous savez comment utiliser le trouver et Trouver tout Méthodes, vous pouvez rechercher des balises n'importe où dans le document XML. Cependant, vous pouvez rendre vos recherches plus puissantes.

Voici comment:

Certaines balises peuvent avoir le même nom, mais des attributs différents. Par exemple, le enfant Les balises ont un nom attribut et différentes valeurs. Vous pouvez effectuer des recherches spécifiques en fonction de celles.

Jetez un œil à ceci:

>>> résultat = bs_content.trouver ("enfant", "name": "rose")
>>> imprimer (résultat)
Deuxième
>>> résultat = bs_content.find_all ("enfant", "name": "rose")
>>> imprimer (résultat)
[Deuxième]]
>>> résultat = bs_content.trouver ("enfant", "name": "jack")
>>> imprimer (résultat)
D'abord
>>> résultat = bs_content.find_all ("enfant", "name": "jack")
>>> imprimer (résultat)
[D'abord]]

Vous verrez qu'il y a quelque chose de différent dans l'utilisation du trouver et Trouver tout Méthodes ici: ils ont tous les deux un deuxième paramètre.

Lorsque vous passez dans un dictionnaire comme deuxième paramètre, le trouver et Trouver tout Méthodes De plus, leur recherche pour obtenir des balises qui ont des attributs et des valeurs qui correspondent à la paire de valeurs fournies fournies.

Par exemple, malgré l'utilisation du trouver Méthode Dans le premier exemple, il a renvoyé le second enfant Tag (au lieu du premier enfant tag), parce que c'est la première balise qui correspond à la requête. Le Trouver tout Tag suit le même principe, sauf qu'il renvoie toutes les balises qui correspondent à la requête, pas seulement la première.

Trouver des balises par des relations

Bien que moins populaire que la recherche par des noms de balises, vous pouvez également rechercher des balises par des relations. Dans le sens réel cependant, c'est plus de navigation que de recherche.

Il existe trois relations clés dans les documents XML:

  • Parent: La balise dans laquelle la balise de référence existe.
  • Enfants: Les balises qui existent dans la balise de référence.
  • Frères et sœurs: Les balises qui existent au même niveau que la balise de référence.

D'après l'explication ci-dessus, vous pouvez en déduire que la balise de référence est le facteur le plus important dans la recherche de balises par des relations. Par conséquent, recherchons la balise de référence et poursuivons l'article.

Regarde ça:

>>> tiers_child = bs_content.trouver ("enfant", "name": "Blue Ivy")
>>> imprimer (troisième_child)

Troisième

Un
Deux
Jumeaux

À partir de l'échantillon de code ci-dessus, la balise de référence pour le reste de cette section sera la troisième enfant Tag, stocké dans un troisième_child variable. Dans les sous-sections ci-dessous, vous verrez comment rechercher des balises en fonction de leur relation parent, frères et sœurs et des enfants avec la balise de référence.

Trouver des parents

Pour trouver la balise parent d'une balise de référence, vous utiliserez le parent attribut. Faire cela renvoie la balise parent, ainsi que les balises en dessous. Ce comportement est tout à fait compréhensible, car les étiquettes des enfants font partie de la balise parent.

Voici un exemple:

>>> résultat = tiers_child.parent
>>> imprimer (résultat)

D'abord
Deuxième

Troisième

Un
Deux
Jumeaux


Quatrième

Trouver des enfants

Pour trouver les étiquettes pour enfants d'une balise de référence, vous utiliserez le enfants attribut. Faire cela renvoie les étiquettes des enfants, ainsi que les sous-marastes sous chacun d'eux. Ce comportement est également compréhensible, car les étiquettes des enfants ont souvent leurs propres tags d'enfants aussi.

Une chose que vous devez noter est que le enfants L'attribut renvoie les balises des enfants en tant que générateur. Donc, si vous avez besoin d'une liste des balises pour enfants, vous devrez convertir le générateur en liste.

Voici un exemple:

>>> résultat = liste (troisième_child.enfants)
>>> imprimer (résultat)
['\ n tiers \ n',
Un
Deux
Jumeaux
, '\ n']

Si vous examinez de plus près l'exemple ci-dessus, vous remarquerez que certaines valeurs de la liste ne sont pas des balises. C'est quelque chose que tu dois faire attention.

JE T'AI EU: Le enfants L'attribut ne renvoie pas seulement les balises des enfants, il renvoie également le texte dans la balise de référence.

Trouver des frères et sœurs

Le dernier de cette section est de trouver des balises qui sont des frères et sœurs à la balise de référence. Pour chaque étiquette de référence, il peut y avoir des étiquettes de frère avant et après. Le Précéaire L'attribut renvoie les balises de frères et sœurs avant la balise de référence, et le Next_Si-Fraclings L'attribut renverra les étiquettes de frères et sœurs après.

Tout comme le enfants attribut, le Précéaire et Next_Si-Fraclings Les attributs renverront les générateurs. Vous devez donc vous convertir en liste si vous avez besoin d'une liste de frères et sœurs.

Regarde ça:

>>> Précéaire_siblings = liste (troisième_child.précédents_sibrings)
>>> imprimer (précédemment_sibrings)
['\ n', Deuxième, '\ n',
D'abord, '\ n']
>>> next_siblings = list (Third_child.Next_Siles)
>>> imprimer (next_siblings)
['\ n', Quatrième]]
>>> imprimer (précédemment_siblings + next_sibrings)
['\ n', Deuxième, '\ n', D'abord,
'\ n', '\ n', Quatrième, '\ n']

Le premier exemple montre les frères et sœurs précédents, le second montre les frères et sœurs suivants; Ensuite, les deux résultats sont combinés pour générer une liste de tous les frères et sœurs pour la balise de référence.

Extraction des balises

Lorsque l'analyse des documents XML, une grande partie du travail réside dans la recherche des bonnes étiquettes. Cependant, lorsque vous les trouvez, vous pouvez également extraire certaines informations de ces balises, et c'est ce que cette section vous apprendra.

Vous verrez comment extraire ce qui suit:

  • Valeurs d'attribut de balise
  • Tag Text
  • Tag Content

Extraction des valeurs d'attribut de balise

Parfois, vous pouvez avoir une raison d'extraire les valeurs des attributs dans une balise. Dans le jumelage d'attribut-valeur suivant par exemple: name = ”rose”, Vous voudrez peut-être extraire «Rose."

Pour ce faire, vous pouvez utiliser le obtenir méthode ou accéder au nom de l'attribut en utilisant [] Comme un index, tout comme vous le feriez lorsque vous travaillez avec un dictionnaire.

Voici un exemple:

>>> résultat = tiers_child.get ("nom")
>>> imprimer (résultat)
Lierre bleu
>>> result = tiers_child ["name"]
>>> imprimer (résultat)
Lierre bleu

Extraction du texte de la balise

Lorsque vous souhaitez accéder aux valeurs de texte d'une balise, vous pouvez utiliser le texte ou cordes attribut. Les deux retourneront le texte dans une balise, et même les tags pour enfants. Cependant, le texte L'attribut les renverra en une seule chaîne, concaténée; tandis que le cordes L'attribut les renverra en tant que générateur que vous pouvez convertir en liste.

Voici un exemple:

>>> résultat = tiers_child.texte
>>> imprimer (résultat)
'\ n tiers \ n \ non \ ntwo \ ntwins \ n \ n'
>>> résultat = liste (troisième_child.cordes)
>>> imprimer (résultat)
['\ n tiers \ n', '\ n', 'one', '\ n', 'deux', '\ n', 'Twins', '\ n', '\ n']

Extraction du contenu de la balise

As d'extraction des valeurs d'attribut et du texte de balise, vous pouvez également extraire tous les balises de contenu. Pour ce faire, vous pouvez utiliser le Contenu attribut; c'est un peu similaire au enfants attribut et donnera les mêmes résultats. Cependant, tandis que le enfants l'attribut renvoie un générateur, le Contenu L'attribut renvoie une liste.

Voici un exemple:

>>> résultat = tiers_child.Contenu
>>> imprimer (résultat)
['\ n tiers \ n',
Un
Deux
Jumeaux
, '\ n']

Imprimer belle

Jusqu'à présent, vous avez vu des méthodes et des attributs importants qui sont utiles lors de l'analyse des documents XML utilisant BeautifulSoup. Mais si vous remarquez, lorsque vous imprimez les balises à l'écran, ils ont une sorte de look en grappe. Bien que l'apparence ne puisse pas avoir un impact direct sur votre productivité, il peut vous aider à analyser plus efficacement et à rendre le travail moins fastidieux.

Voici un exemple d'impression de la manière normale:

>>> imprimer (troisième_child)

Troisième

Un
Deux
Jumeaux

Cependant, vous pouvez améliorer son apparence en utilisant le enjoliver méthode. Appelez simplement le enjoliver Méthode sur la balise tout en imprimant, et vous obtiendrez quelque chose de agréable visuellement.

Regarde ça:

Conclusion

Les documents d'analyse sont un aspect important de l'approvisionnement pour les données. Les documents XML sont assez populaires, et j'espère que vous êtes mieux équipé pour les prendre et extraire les données que vous souhaitez.

De cet article, vous pouvez maintenant:

  • Rechercher des balises soit par des noms, soit par des relations
  • extraire les données des balises

Si vous vous sentez assez perdu et que vous êtes assez nouveau dans la bibliothèque BeautifulSoup, vous pouvez consulter le tutoriel BeautifulSoup pour les débutants.