BelleSoupe

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

Comment analyser des 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 contiennent 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 en travaillant avec HTML.

Il y a deux aspects principaux à l'analyse des fichiers XML. Elles sont:

Vous devrez trouver la balise qui contient les informations souhaitées, 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 matière de scraping Web avec Python. Étant donné que les fichiers XML sont similaires aux fichiers HTML, il est également capable de les analyser. Cependant, pour analyser des fichiers XML à l'aide de BeautifulSoup, il est préférable d'utiliser Python lxml analyseur.

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

pip installer 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 à continuer avec le reste de l'article.

Voici un exemple :

$python
Python 3.7.4 (balises/v3.7.4:e09359112e, 8 juillet 2019, 20:34:20)
[MSC v.1916 64 bits (AMD64)] sur win32
Tapez "aide", "droit d'auteur", "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 découvrirez dans la suite de l'article. Copiez, collez simplement dans votre éditeur et enregistrez ; un nom comme goûter.xml devrait suffire.



L'arbre

D'abord
Deuxième

La troisième

Une
Deux
jumeaux


Quatrième

Maintenant, dans votre script Python ; vous devrez lire le fichier XML comme un fichier normal, puis le transmettre à BeautifulSoup. Le reste de cet article utilisera les bs_content variable, il est donc important que vous fassiez cette étape.

# Importer BeautifulSoup
de bs4 importer BeautifulSoup en tant que bs
contenu = []
# Lire le fichier XML
avec open("exemple.xml", "r") en tant que fichier :
# Lit chaque ligne du fichier, readlines() renvoie une liste de lignes
contenu = fichier.lignes de lecture()
# Combiner les lignes de la liste dans une chaîne
contenu = "".rejoindre (contenu)
bs_content = bs(contenu, "lxml")

L'exemple de code ci-dessus importe BelleSoupe, puis il lit le fichier XML comme un fichier normal. Après cela, il transmet le contenu dans le fichier importé BelleSoupe bibliothèque ainsi que l'analyseur de choix.

Vous remarquerez que le code ne s'importe pas lxml. Il n'est pas nécessaire que BelleSoupe choisira le lxml analyseur à la suite du passage "lxml" dans l'objet.

Maintenant, vous pouvez continuer 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 manières de procéder lors de l'utilisation de BeautifulSoup ; vous devez donc en connaître une poignée pour avoir les meilleurs outils pour la situation appropriée.

Vous pouvez trouver des balises dans les documents XML en :

Recherche de balises par noms

Il existe deux méthodes BeautifulSoup que vous pouvez utiliser pour rechercher des balises par nom. Cependant, les cas d'utilisation diffèrent ; jetons un coup d'oeil à eux.

trouve

Par expérience personnelle, vous utiliserez le trouve 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 Rien.

Voici un exemple :

>>> résultat = bs_content.trouver("données")
>>> imprimer (résultat)
Une
>>> résultat = bs_content.trouver("unique")
>>> imprimer (résultat)
jumeaux
>>> résultat = bs_content.trouver("père")
>>> imprimer (résultat)
Rien
>>> résultat = bs_content.trouver("mère")
>>> imprimer (résultat)
Rien

Si vous regardez l'exemple, vous verrez que le trouve la méthode renvoie une balise si elle correspond au nom, sinon elle renvoie None. Cependant, si vous y regardez de plus près, vous verrez qu'il ne renvoie qu'une seule balise.

Par exemple, lorsque 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 trouve méthode ne renverra que la première balise qui correspond à sa requête.

Alors, comment pouvez-vous trouver d'autres balises aussi? Cela nous amène à la méthode suivante.

Trouver tout

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

Voici un exemple :

>>> résultat = bs_content.find_all("données")
>>> imprimer (résultat)
[Une, Deux]
>>> résultat = bs_content.find_all("enfant")
>>> imprimer (résultat)
[D'abord, Deuxième,
La troisième

Une
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 utiliser le trouve 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 ces.

Regarde ça :

>>> résultat = bs_content.find("enfant", "nom": "Rose")
>>> imprimer (résultat)
Deuxième
>>> résultat = bs_content.find_all("enfant", "nom": "Rose")
>>> imprimer (résultat)
[Deuxième]
>>> résultat = bs_content.find("enfant", "nom": "Jack")
>>> imprimer (résultat)
D'abord
>>> résultat = bs_content.find_all("enfant", "nom": "Jack")
>>> imprimer (résultat)
[D'abord]

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

Lorsque vous passez un dictionnaire en second paramètre, le trouve et Trouver tout les méthodes approfondissent leur recherche pour obtenir des balises dont les attributs et les valeurs correspondent à la paire clé:valeur fournie.

Par exemple, malgré l'utilisation du trouve méthode dans le premier exemple, elle a renvoyé la seconde enfant balise (au lieu de la première enfant tag), car c'est le premier tag 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 relations

Bien que moins populaire que la recherche par noms de balises, vous pouvez également rechercher des balises par relations. Dans le vrai sens cependant, il s'agit plus de naviguer que de chercher.

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

De l'explication ci-dessus, vous pouvez déduire que la balise de référence est le facteur le plus important dans la recherche de balises par relations. Par conséquent, cherchons la balise de référence et continuons l'article.

Regarde ça:

>>> troisième_enfant = bs_content.find("enfant", "nom": "Lierre bleu")
>>> imprimer (troisième_enfant)

La troisième

Une
Deux
jumeaux

À partir de l'exemple de code ci-dessus, la balise de référence pour le reste de cette section sera la troisième enfant étiquette, stockée dans un troisième_enfant variable. Dans les sous-sections ci-dessous, vous verrez comment rechercher des balises en fonction de leur relation parent, frère et enfant 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. Cela renvoie la balise parente, ainsi que les balises sous-jacentes. Ce comportement est tout à fait compréhensible, puisque les balises enfants font partie de la balise parent.

Voici un exemple :

>>> résultat = troisième_enfant.parent
>>> imprimer (résultat)

D'abord
Deuxième

La troisième

Une
Deux
jumeaux


Quatrième

Trouver des enfants

Pour trouver les balises enfants d'une balise de référence, vous utiliserez le enfants attribut. Faire cela renvoie les balises enfants, ainsi que les sous-balises sous chacune d'elles. Ce comportement est également compréhensible, car les balises enfants ont souvent aussi leurs propres balises enfants.

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

Voici un exemple :

>>> résultat = liste (troisième_enfant.enfants)
>>> imprimer (résultat)
['\n        Troisième\n     ',
Une
Deux
jumeaux
, '\n']

Si vous regardez 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 vous devez surveiller.

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

Trouver des frères et sœurs

La dernière étape de cette section consiste à rechercher des balises sœurs de la balise de référence. Pour chaque balise de référence, il peut y avoir des balises sœurs avant et après. le frères_précédents L'attribut renverra les balises sœurs avant la balise de référence, et le next_siblings l'attribut renverra les balises frères après lui.

Tout comme le enfants attribut, le frères_précédents et next_siblings les attributs renverront des générateurs. Vous devez donc convertir en liste si vous avez besoin d'une liste de frères et sœurs.

Regarde ça:

>>> previous_siblings = list(third_child.frères_précédents)
>>> imprimer(previous_siblings)
['\n', Deuxième, '\n',
D'abord, '\n']
>>> next_siblings = list(third_child.prochain_frères)
>>> imprimer(next_siblings)
['\n', Quatrième]
>>> print(previous_siblings + next_siblings)
['\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 ; puis 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 à partir de balises

Lors de l'analyse de documents XML, une grande partie du travail consiste à trouver les bonnes balises. Cependant, lorsque vous les trouvez, vous pouvez également vouloir extraire certaines informations de ces balises, et c'est ce que cette section vous apprendra.

Vous verrez comment extraire les éléments suivants :

Extraction des valeurs d'attribut de balise

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

Pour ce faire, vous pouvez utiliser le obtenir méthode ou en accédant au nom de l'attribut à l'aide [] comme un index, comme vous le feriez avec un dictionnaire.

Voici un exemple :

>>> résultat = troisième_enfant.obtenir("nom")
>>> imprimer (résultat)
Lierre bleu
>>> résultat = troisième_enfant["nom"]
>>> 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 alors chaînes attribut. Les deux renverront le texte dans une balise, et même les balises enfants. Cependant, le texte l'attribut les renverra sous forme de chaîne unique, concaténée ; tandis que le chaînes l'attribut les renverra sous forme de générateur que vous pourrez convertir en liste.

Voici un exemple :

>>> résultat = troisième_enfant.texte
>>> imprimer (résultat)
'\n    Troisième\n      \nUn\nDeux\nJumeaux\n\n'
>>> résultat = liste (troisième_enfant.chaînes)
>>> imprimer (résultat)
['\n Troisième\n      ', '\n', 'Un', '\n', 'Deux', '\n', 'Jumeaux', '\n', '\n']

Extraction du contenu des balises

En plus d'extraire les valeurs des attributs et le texte des balises, vous pouvez également extraire tout le contenu des balises. Pour ce faire, vous pouvez utiliser le Contenu attribut; c'est un peu comme le enfants attribut et donnera les mêmes résultats. Cependant, alors que le enfants l'attribut renvoie un générateur, le Contenu l'attribut renvoie une liste.

Voici un exemple :

>>> résultat = troisième_enfant.Contenu
>>> imprimer (résultat)
['\n        Troisième\n     ',
Une
Deux
jumeaux
, '\n']

Impression Belle

Jusqu'à présent, vous avez vu quelques méthodes et attributs importants qui sont utiles lors de l'analyse de documents XML à l'aide de BeautifulSoup. Mais si vous remarquez, lorsque vous imprimez les balises à l'écran, elles ont une sorte d'aspect groupé. Bien que l'apparence n'ait pas d'impact direct sur votre productivité, elle peut vous aider à analyser plus efficacement et à rendre le travail moins fastidieux.

Voici un exemple d'impression normale :

>>> imprimer (troisième_enfant)

La troisième

Une
Deux
jumeaux

Cependant, vous pouvez améliorer son apparence en utilisant le enjoliver méthode. Appelez simplement le enjoliver méthode sur l'étiquette lors de l'impression, et vous obtiendrez quelque chose d'agréable.

Regarde ça:

Conclusion

L'analyse des documents est un aspect important de la recherche de données. Les documents XML sont assez populaires, et j'espère que vous êtes mieux équipé pour les prendre en charge et extraire les données que vous voulez.

A partir de cet article, vous pouvez désormais :

Si vous vous sentez un peu perdu et que vous débutez dans la bibliothèque BeautifulSoup, vous pouvez consulter le didacticiel BeautifulSoup pour les débutants.

Comment utiliser AutoKey pour automatiser les jeux Linux
AutoKey est un utilitaire d'automatisation de bureau pour Linux et X11, programmé en Python 3, GTK et Qt. En utilisant ses fonctionnalités de script e...
Comment afficher le compteur FPS dans les jeux Linux
Les jeux Linux ont reçu une impulsion majeure lorsque Valve a annoncé la prise en charge de Linux pour le client Steam et leurs jeux en 2012. Depuis l...
Comment télécharger et jouer à Civilization VI de Sid Meier sur Linux
Présentation du jeu Civilization 6 est une version moderne du concept classique introduit dans la série de jeux Age of Empires. L'idée était assez sim...