Passer au contenu

Quelles sont les alternatives BeautifulSoup pour l’analyse HTML en Python ?

En tant que développeur Python, vous connaissez probablement BeautifulSoup (alias BS4) – la vénérable bibliothèque d'analyse HTML/XML qui est un incontournable du web scraping Python depuis plus d'une décennie.

Mais vous ne savez peut-être pas que Beautiful Soup est loin d’être la seule option pour analyser le HTML en Python de nos jours. En fait, il existe un nombre surprenant d'alternatives BeautifulSoup performantes qui, dans certains cas, surpassent même BS4 en termes de fonctionnalités et de performances.

Dans ce guide complet, nous explorerons certaines des alternatives BeautifulSoup les plus populaires et les plus puissantes pour le scraping et l'analyse HTML avec Python.

Pourquoi envisager les alternatives BeautifulSoup ?

Avant de plonger dans les options, vous vous demandez peut-être : pourquoi même envisager des alternatives en premier lieu ?

Voici quelques raisons pour lesquelles vous voudrez peut-être regarder au-delà de BeautifulSoup pour vos projets de web scraping Python :

  • Meilleure performance – Certains analyseurs plus récents surpassent considérablement BS4 dans les benchmarks. La vitesse est essentielle lors du scraping de grands sites.

  • Plus de fonctionnalités – Les bibliothèques comme lxml offrent des fonctionnalités supplémentaires telles que la prise en charge de XPath.

  • Meilleure analyse HTML5 – BeautifulSoup peut parfois avoir des difficultés avec du HTML malformé et moderne.

  • API plus simples – Les bibliothèques comme Parsel offrent des API Pythoniques plus intuitives.

  • multi-threading – Certains analyseurs alternatifs permettent une analyse multithread pour tirer parti de plusieurs cœurs de processeur.

  • Conformité aux normes – Vous aurez peut-être besoin d’un analyseur qui suit rigoureusement les spécifications HTML.

  • Installation plus facile – BS4 possède certaines dépendances C qui peuvent entraîner des problèmes d'installation, en particulier sur les systèmes restreints comme AWS Lambda. Les alternatives avec du code Python pur peuvent être déployées plus facilement.

Ainsi, même si BS4 reste un bon choix, d’autres excellentes options méritent votre attention. Jetons un coup d'œil à certaines des meilleures alternatives BeautifulSoup pour l'analyse HTML et le web scraping en Python !

lxml – Rapide comme l'éclair

L'une des alternatives BeautifulSoup les plus populaires et les plus puissantes est lxml. La bibliothèque lxml fournit une API extrêmement rapide et riche en fonctionnalités pour analyser le HTML et le XML avec Python.

Dans les benchmarks, lxml surpasse systématiquement BeautifulSoup avec des marges significatives. Il n'est pas rare de voir Améliorations de la vitesse 10 à 100x lors de l'utilisation de lxml pour l'analyse HTML au lieu de BeautifulSoup.

Cela fait de lxml un outil essentiel pour quiconque explore de grands sites ou analyse d'énormes documents HTML. Les avantages de vitesse vous permettent d'analyser le balisage beaucoup plus efficacement et de réduire les coûts pour le scraping fortement fileté.

Quelques avantages clés de lxml :

  • Vitesse d'analyse XML et HTML fulgurante
  • Prise en charge de très gros documents
  • Prise en charge de XPath 1.0 pour les requêtes sophistiquées
  • Prise en charge du sélecteur CSS similaire à BeautifulSoup
  • Threading plus facile – lxml libère le GIL et permet donc une analyse multithread
  • Prise en charge de l'analyse HTML5

Passons en revue un exemple rapide pour voir lxml en action :

from lxml import html
import requests

page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)

# Get headlines 
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)

print(headings)

Cet exemple simple démontre la vitesse de lxml : il peut analyser et interroger une page Wikipédia complète en millisecondes !

Quelques inconvénients à considérer à propos de lxml :

  • Courbe d'apprentissage plus délicate que BeautifulSoup. Les requêtes XPath ont une courbe d'apprentissage plus abrupte que les sélecteurs CSS.
  • Pas de détection d'encodage intégrée comme BS4.
  • Aucune représentation d'objet Pythonic d'éléments comme BS4. La manipulation se fait via les API de navigation DOM.

Néanmoins, pour la plupart des web scraping de production, lxml est un élément essentiel de votre boîte à outils. Les gains de vitesse vous permettent de récupérer beaucoup plus de données de manière beaucoup plus efficace.

parsel – lxml, simplifié

Si vous aimez ce que lxml apporte mais trouvez l'API trop complexe, consultez parcelle.

Parsel fournit une API plus facile à utiliser et plus Pythonique en encapsulant lxml et en fournissant une interface basée sur un sélecteur pour extraire les données de HTML/XML.

Le principal avantage du colis est simplicité et lisibilité. Parsel a été conçu dès le départ en pensant au web scraping, tandis que lxml prend en charge une gamme beaucoup plus large de fonctionnalités d'analyse XML.

Par rapport à lxml, parsel propose :

  • Expressions de sélecteur CSS simplifiées
  • Gestion automatique de l'encodage
  • API d'extraction d'attributs et de texte beaucoup plus simples
  • Approche globalement plus intuitive

Par exemple, voici comment extraire du texte et des attributs à l'aide de sélecteurs de Parsel :

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/fr/more">More</a></p>
           </div>‘‘‘

sel = Selector(text=html)

print(sel.css(‘p::text‘).get()) # Some text More 

print(sel.css(‘a::attr(href)‘).get()) # /more

L'API Selector sera très familière à toute personne venant de BeautifulSoup ou de jQuery. Mais vous bénéficiez de tous les avantages en termes de performances de lxml sous le capot !

Dans l'ensemble, Parsel est un excellent choix lorsque vous souhaitez une interface de scraping simple et intuitive mais que vous ne voulez pas sacrifier les avantages de vitesse ou de compatibilité de lxml.

html5lib – Analyse conforme aux normes

L'une des alternatives BeautifulSoup les plus cool est html5lib.

html5lib est unique car il analyse le HTML de la même manière qu'un navigateur Web moderne. Il aborde rigoureusement la spécification HTML et génère un modèle objet de document qui adhère étroitement à la spécification officielle DOM du W3C.

Les avantages de html5lib incluent :

  • Analyse HTML fidèle et conforme aux règles du navigateur HTML5
  • Gestion gracieuse du balisage malformé du monde réel
  • Installation facile car implémenté uniquement en Python
  • Peut servir de remplacement immédiat pour BS4 dans la plupart des cas
  • Hautement personnalisable et extensible

Regardons l'utilisation de base de html5lib :

import html5lib

html = ‘<div><span>Example</span></div>‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

print(dom.getElementsByTagName(‘span‘)[0].toxml())  
# <span>Example</span>

Nous pouvons voir que html5lib produit un objet DOM standard à partir du document.

Un inconvénient est que html5lib est plus lent que quelque chose comme lxml. Mais c'est un excellent choix lorsque vous avez besoin d'un analyseur capable de gérer même un balisage mal formé d'une manière compatible avec le navigateur.

Analyseurs HTML Python alternatifs

Bien que lxml, parsel et html5lib soient parmi les alternatives BeautifulSoup les plus performantes, il existe quelques autres options :

  • PyQueryName – Manipulation DOM de style jQuery.
  • BelleSoupe4 – La OG BeautifulSoup. API plus lente mais très accessible.
  • Analyseur HTML – L'analyseur HTML intégré à Python.
  • htmlmin – Pour minifier le HTML.
  • Balisage sécurisé – Implémente un analyseur HTML/XML exposant le balisage en tant qu'objets Python.

Ces bibliothèques répondent à différents besoins d'analyse. PyQuery, par exemple, fournit une manipulation DOM de type jQuery. BeautifulSoup4 reste populaire grâce à son API simple.

Il existe également des liaisons Python pour les analyseurs HTML rapides comme Oie ainsi que jfast qui exploitent d’autres moteurs d’analyse à grande vitesse sous-jacents.

Bien qu'il ne s'agisse pas d'un remplacement direct, pour les tâches d'analyse de base, le HTMLParser intégré de Python peut également fonctionner.

Le fait est que ne vous limitez pas à BeautifulSoup. Évaluez vos besoins par rapport aux nombreux outils d’analyse disponibles.

Comment les analyseurs se comparent dans les benchmarks

Pour démontrer les différences de performances, évaluons certaines opérations courantes à l'aide de BeautifulSoup, lxml, html5lib et HTMLParser de Python.

J'ai créé un simple script de référence cela chronomètre divers analyseurs sur 3 tâches :

  1. Analyse d'une page HTML Wikipédia d'environ 3 Ko
  2. Trouver tous les liens
  3. Trouver des éléments spécifiques

Et voici les résultats sur mon ordinateur portable :

AnalyseurTemps d'analyseTrouver tous les liensRechercher un élément
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
BeautifulSoup12ms18ms1ms
Analyseur HTML4ms32ms0.5ms

Comme prévu, lxml est extrêmement rapide – 10 fois plus rapide que html5lib sur certaines opérations. Étonnamment, HTMLParser tient bon pour l'analyse de base, mais commence à prendre du retard lors de l'interrogation d'éléments.

Ces repères sur un petit document accentuent les différences. Les écarts s'élargiraient encore plus sur les documents HTML plus volumineux où la vitesse de lxml brille vraiment.

Exemples concrets

Passons maintenant en revue quelques exemples concrets utilisant ces analyseurs alternatifs pour les tâches de web scraping :

Supprimer les listes de produits avec lxml

Ici, nous allons extraire quelques listes de produits d'un site de commerce électronique. Lxml permet d'extraire rapidement toutes les données dont nous avons besoin :

from lxml import html
import requests

page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)

# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘) 

for product in products:
   name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
   price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

   print(name, price)   

Avec lxml, nous pouvons analyser rapidement même les documents HTML volumineux et utiliser des requêtes XPath succinctes pour extraire toutes les données dont nous avons besoin.

Gratter des tables avec pandas et html5lib

Disons que nous devons copier des tableaux HTML dans un DataFrame pandas. Html5lib analyse les tables de manière fiable :

import html5lib
import pandas as pd

html = ‘‘‘<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
   </tr>
   <tr>
     <td>John</td>
     <td>30</td>  
   </tr>
   <tr>
     <td>Jane</td>
     <td>32</td>  
   </tr>
</table>‘‘‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

rows = []
for tr in dom.getElementsByTagName(‘tr‘):
  rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])

df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)  
#    Name  Age
# 0  John   30   
# 1  Jane   32

Le respect des normes par Html5lib garantit que le scraping de table fonctionne de manière cohérente, même sur un balisage problématique.

Gratter du texte avec du parsel

Pour les pages contenant beaucoup de texte, parsel facilite l'extraction :

from parsel import Selector 

html = ‘‘‘<div>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
         </div>‘‘‘

sel = Selector(text=html)  
content = sel.xpath(‘//div//text()‘).getall()
print(content)

# [‘Paragraph 1‘, ‘Paragraph 2‘]

Parsel nous offre la simplicité de BeautifulSoup combinée à la rapidité de lxml !

Critères de choix d'une bibliothèque d'analyse HTML

Lors de l’évaluation de toutes ces alternatives BeautifulSoup, quels critères sont les plus importants pour votre projet ?

  • Vitesse – Si les performances sont critiques, lxml est difficile à battre.

  • Correction – Pour une analyse fiable des pages problématiques, html5lib brille.

  • Jeu de fonctionnalités – Lxml fournit une navigation DOM plus complète et une prise en charge XPath.

  • API familière – Les sélecteurs CSS de BeautifulSoup sont les plus faciles à apprendre.

  • Gestion du balisage mal formé – Lxml et html5lib gèrent le HTML du monde réel de manière plus robuste.

  • Conformité aux normes – Html5lib respecte le plus strictement le comportement du navigateur HTML5.

  • Facilité d’utilisation – Parsel et PyQuery proposent les API de scraping les plus simples.

Il n’existe pas de meilleur analyseur pour tous les scénarios. Analysez vos besoins spécifiques et vos cas d'utilisation pour décider ce qui est optimal.

Il est souvent préférable d'utiliser une combinaison de bibliothèques – par exemple html5lib pour analyser et lxml pour interroger. Testez différentes options sur des exemples de pages pour avoir une idée de ce qui fonctionne bien et de manière fiable pour vos besoins particuliers en matière de web scraping.

Passer sans analyseur pour le web scraping

Nous nous sommes concentrés ici sur les bibliothèques d'analyse HTML. Mais il convient de noter qu’il existe des alternatives à l’approche parsing.

Il est possible de récupérer des données sans analyseur HTML en utilisant :

  • Expressions régulières – Regex peut être utilisé pour faire correspondre un modèle au HTML brut et extraire des données. Fragile mais parfois réalisable pour des cas simples.
  • Opérations sur les chaînes – Utilisez les méthodes de chaîne Python pour rechercher, diviser et découper des chaînes HTML.
  • Requêtes HTTP – Envoyez des requêtes directement aux API et récupérez les réponses des API.
  • Automatisation du navigateur – Tirez parti d’outils tels que Selenium pour récupérer le contenu JavaScript rendu.
  • Convertir vers des formats comme JSON/XML – Supprimez les flux de données structurés au lieu du HTML.

Ces approches peuvent être utiles, mais ne sont généralement pas évolutives ou ne fonctionnent pas de manière fiable, en particulier pour les sites complexes. Généralement, les bibliothèques d'analyse HTML sont recommandées pour leur robustesse.

Mais si vos pages sont extrêmement simples ou si vous avez besoin d’un rendu JS, une approche sans analyseur peut suffire.

Faits marquants

Bien que Beautiful Soup résolve de nombreux besoins courants d'analyse HTML, des alternatives telles que lxml, parsel et html5lib méritent votre considération :

  • Lxml – La référence en matière de vitesse et de performances. Idéal pour le web scraping à l’échelle de la production.

  • parcelle – API simple pour un scraping facile. S'appuie sur la vitesse lxml.

  • html5lib – Analyse conforme au navigateur pour la précision et le respect des normes.

  • Repères – Lxml est jusqu'à 100 fois plus rapide que html5lib sur certaines opérations.

  • Critères – Vitesse vs lisibilité vs exactitude. Évaluez les compromis pour votre cas d’utilisation.

  • Aucun analyseur – Pour les cas simples, les opérations regex/string peuvent fonctionner.

Ne vous limitez pas à BeautifulSoup : l'écosystème Python offre une incroyable variété de capacités d'analyse HTML. Bénéficiez des outils adaptés à chaque chantier !

Mots clés:

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *