Python >> Tutoriel Python >  >> Python

Analyse HTML avec Python et LXML

Dans cet article, vous apprendrez les bases de l'analyse d'un document HTML à l'aide de Python et de la bibliothèque LXML.

Présentation

Les données sont l'ingrédient le plus important de la programmation. Il se présente sous toutes les formes et formes. Parfois, il est placé dans des documents tels que CSV ou JSON, mais parfois il est stocké sur Internet ou dans des bases de données. Certains d'entre eux sont stockés/transférés ou traités via le format XML, qui est à bien des égards similaire au format HTML, mais son objectif est de transférer et de stocker des données, contrairement au HTML, dont le but principal est d'afficher les données. De plus, la manière d'écrire HTML et XML est similaire. Malgré les différences et les similitudes, ils se complètent très bien.

Xpath et XML sont tous deux conçus par la même société W3C, qui impose que Xpath soit le module Python le plus compatible à utiliser pour analyser les documents XML. Étant donné que l'un des principes de programmation qui vous pousserait vers le succès de la programmation est de "ne pas réinventer la roue", nous allons nous référer au document et aux sources du consortium W3C (https://www.w3.org/) en ce qui concerne le syntaxe et opérateurs sur nos exemples pour rapprocher le concept de XPath des personnes souhaitant mieux le comprendre et l'utiliser sur des problèmes réels.

L'industrie informatique a accepté la méthode XML de transfert de données comme l'un de ses principes. Imaginez si l'une de vos tâches consistait à collecter des informations sur Internet ? Le copier-coller est l'un des outils les plus simples à utiliser (car il est également régulièrement utilisé par les programmeurs) ; cela pourrait nous amener à collecter des données simples sur le Web, bien que le processus puisse devenir péniblement répétitif. Pourtant, si nous avons des données plus robustes ou plus de pages Web pour collecter les données, nous pourrions être enclins à utiliser des packages Python plus avancés pour automatiser notre collecte de données.

Avant de commencer à examiner les outils et les stratégies de grattage, il est bon de savoir que le grattage peut ne pas être légal dans tous les cas, il est donc fortement suggéré de consulter les conditions d'utilisation d'un site Web particulier ou la loi sur le droit d'auteur concernant la région. dans lequel le site Web fonctionne.

Aux fins de la récolte des données Web, nous utiliserons plusieurs bibliothèques Python qui nous permettent de faire exactement cela. Le premier d'entre eux est le module de requêtes. Ce qu'il fait, c'est qu'il envoie les requêtes HTTP, qui nous renvoient l'objet de réponse. Il n'est utilisé qu'en cas d'envie de récupérer le contenu d'Internet. Si nous essayons d'analyser le fichier XML statique, cela ne serait pas nécessaire.

Il existe de nombreux modules d'analyse. LXML, Scrapy et BeautifulSoup en font partie. Dire lequel est le meilleur est souvent négligé car leur taille et leur fonctionnalité diffèrent les unes des autres. Par exemple, BeautifulSoup est plus complexe et vous offre plus de fonctionnalités, mais LXML et Scrapy sont légers et peuvent vous aider à parcourir les documents à l'aide des sélecteurs XPath et CSS.

Il existe certains pièges lorsque vous essayez de parcourir le document à l'aide de XPath. L'erreur courante lors de la tentative d'analyse du XML en utilisant la notation XPath est que de nombreuses personnes essaient d'utiliser la bibliothèque BeautifulSoup. En fait, ce n'est pas possible car il ne contient pas les méthodes de traversée XPath. À ces fins, nous utiliserons la bibliothèque LXML.

La bibliothèque de requêtes est utilisée au cas où nous voudrions télécharger un balisage HTML à partir d'un site Web particulier.

La première étape serait d'installer les packages nécessaires. Grâce à la notation d'installation pip, tous les modules ci-dessus peuvent être installés assez facilement.

Étapes nécessaires :

  1. pip install lxml (le module xpath fait partie de la bibliothèque lxml)
  2. pip install requests (si le contenu se trouve sur une page Web)

La meilleure façon d'expliquer l'analyse XML est de l'imaginer à travers les exemples.

La première étape serait d'installer les modules nécessaires. Grâce à la notation d'installation pip, tous les modules ci-dessus peuvent être installés assez facilement.

Qu'est-ce que XPath ?

La structure des documents XML et HTML est structurellement composée de nœuds (ou de nœuds quelconques), qui est une image plus large qui représente la structure de type arbre généalogique. L'instance de toit, ou l'ancêtre d'origine dans chaque arbre, est appelée le nœud racine et n'a pas de nœuds supérieurs à lui-même. Les nœuds subordonnés sont en ce sens respectivement appelés enfants ou frères et sœurs, qui sont les éléments au même niveau que les enfants. Les autres termes utilisés pour naviguer et parcourir l'arbre sont les ancêtres et les descendants, qui reflètent essentiellement la relation entre les nœuds de la même manière que nous la reflétons dans des exemples d'arbres généalogiques réels.

XPath est un langage de requête qui nous aide à naviguer et à sélectionner les éléments de nœud dans une arborescence de nœuds. Il s'agit essentiellement d'une carte d'étapes que nous devons créer pour atteindre certains éléments de l'arbre. Les différentes parties de cette carte des étapes sont appelées les étapes de localisation, et chacune de ces étapes nous mènerait à une certaine partie du document.

La terminologie utilisée pour l'orientation le long de l'axe (par rapport au nœud actuel) est très intuitive car elle utilise des expressions anglaises régulières liées aux relations réelles de l'arbre généalogique.

Sélecteur XPath

Le sélecteur XPath est la condition à l'aide de laquelle nous pouvons naviguer dans un document XML. Il décrit les relations comme un ordre hiérarchique des instances incluses dans notre chemin. En combinant différents segments de syntaxe XML, il nous aide à parcourir les parties souhaitées du document. Le sélecteur fait partie du langage de requête XPath. En ajoutant simplement différents critères, le sélecteur XPath nous conduirait à différents éléments dans l'arborescence du document. La meilleure façon d'apprendre la syntaxe et les opérateurs du sélecteur XPath est de l'implémenter sur un exemple. Pour savoir configurer le sélecteur XPath, il est indispensable de connaître la syntaxe XPath. Le sélecteur XPath est compilé à l'aide d'un module etree ou HTML inclus dans le package LXML. La différence n'est que si nous analysons le document XML ou HTML.

Le sélecteur fonctionne de la même manière qu'une méthode de recherche avec laquelle il vous permet de sélectionner un chemin relatif de l'élément plutôt que le chemin absolu, ce qui rend l'ensemble du parcours moins sujet aux erreurs au cas où le chemin absolu deviendrait trop compliqué.

Syntaxe XPath

La syntaxe XPath peut être divisée en plusieurs groupes. Pour avoir une compréhension exacte du matériel présenté, nous allons appliquer d'autres expressions et fonctions répertoriées sur notre exemple de document, qui serait répertorié ci-dessous. Dans cette session d'apprentissage, nous allons utiliser un site web dédié aux exercices de scraping.

Sélection du nœud :

Expression Description
nom du nœud Sélectionne tous les nœuds avec le nom "nodename "
/ Sélectionne à partir du nœud racine
// Sélectionne les nœuds du document à partir du nœud actuel qui correspondent à la sélection, peu importe où ils se trouvent.
. Sélectionne le nœud actuel
.. Sélectionne le parent du nœud actuel
@ Sélectionne les attributs

Utiliser ".." et "." nous pouvons diriger et changer de niveau comme nous le désirons. Les notations à deux points nous conduiraient d'où que nous soyons à notre élément parent, tandis que les notations à un point nous dirigeraient vers le nœud actuel.

Le chemin que nous parcourons depuis le « nœud de contexte » (notre nœud de référence), qui est le jalon de notre recherche, est appelé « axes », et il est noté avec une double barre oblique //. Ce qu'il fait, c'est qu'il commence à traverser à partir de la première instance du nœud donné. Cette méthode de sélection de chemin est appelée "sélection de chemin relatif". Pour être certain que l'expression // (balise vide) fonctionnerait, elle doit précéder un astérisque (*) ou la balise de nom. En inspectant l'élément et en copiant sa valeur XPath, nous obtenons le chemin absolu.

Fonctions et opérateurs XPath

voici 6 opérateurs courants qui sont utilisés dans la requête XPath. Les opérateurs sont notés de la même manière qu'en Python ordinaire et ont le même objectif. Les fonctions sont destinées à faciliter la recherche des éléments souhaités ou de leur contenu.

Expression du chemin Résultat
= Égal à
!= Pas égal à
> Est supérieur à
< Est inférieur à
=> Est supérieur ou égal à
=< Est inférieur ou égal à

Pour ajouter plus de fonctionnalités à notre expression XPath, nous pouvons utiliser certaines des fonctions de la bibliothèque LXML. Tout ce qui est écrit entre les "[]" est appelé un prédicat et il est utilisé pour décrire plus précisément le chemin de recherche. Les fonctions les plus fréquemment utilisées sont contains() et starts-with() . Ces fonctions et leurs résultats seraient affichés dans le tableau ci-dessous.

Monter et descendre l'axe

La syntaxe conventionnelle utilisée pour parcourir de haut en bas les axes XPath est ElementName::axis .

Pour atteindre les éléments placés au-dessus ou au-dessous de nos axes actuels, nous pourrions utiliser certains des axes suivants.

Monter les axes Exemples
ancestor //ul/li/a[contains(@href, 'categ')]/ancestor::node()
parent //ul/li/a[contains(@href, 'categ')]/parent::node()
preceding //ul/li/a[contains(@href, 'categ')]/preceding::div
preceding-sibling //a[contains(@href, 'categ')]/preceding-sibling::*
Le long des axes Exemples
descendant //a[starts-with(@href, 'catalogue')]/descendant::*
following /html/body/div/div/ul/li[1]/a
following-sibling /html/body/div/div/ul/li[1]/a/following::li
child //div/div/section/div[2]/ol/li[1]/article/h3/child::*

Un exemple simple

Le but de cet exercice de scraping est de scraper tous les genres de livres placés sur le côté gauche du site web. Il est presque nécessaire de voir la source de la page et d'inspecter certains des éléments que nous visons à gratter.

from lxml import html
import requests

url = 'http://books.toscrape.com/'

# downloading the web page by making a request objec
res = requests.get(url)

# making a tree object
tree = html.fromstring(res.text)

# navingating the tree object using the XPath
book_genres = tree.xpath("//ul/li/a[contains(@href, 'categ')]/text()")[0:60]

# since the result is the list object, we iterate the elements,
# of the list by making a simple for loop
for book_genre in book_genres:
    print (book_genre.strip())

Ressources :

  1. https://lxml.de/
  2. https://scrapinghub.github.io/xpath-playground/
  3. https://2.python-requests.org/en/master/
  4. "http://books.toscrape.com/