Salta al contenuto

Quali sono alcune alternative a BeautifulSoup per l'analisi HTML in Python?

Come sviluppatore Python, probabilmente hai familiarità con BeautifulSoup (aka BS4), la venerabile libreria di parsing HTML/XML che è stata un punto fermo del web scraping Python per oltre un decennio.

Ma potresti non essere consapevole del fatto che al giorno d'oggi Beautiful Soup non è l'unica opzione per analizzare l'HTML in Python. In effetti, esiste un numero sorprendente di valide alternative a BeautifulSoup che in alcuni casi superano addirittura BS4 in termini di funzionalità e prestazioni.

In questa guida completa, esploreremo alcune delle alternative BeautifulSoup più popolari e potenti per lo scraping e l'analisi HTML con Python.

Perché prendere in considerazione le alternative a BeautifulSoup?

Prima di immergerti nelle opzioni, potresti chiederti: perché prendere in considerazione delle alternative in primo luogo?

Ecco alcuni motivi per cui potresti voler guardare oltre BeautifulSoup per i tuoi progetti di web scraping Python:

  • Migliori prestazioni – Alcuni parser più recenti superano significativamente BS4 nei benchmark. La velocità è fondamentale quando si esegue lo scraping di siti di grandi dimensioni.

  • Più caratteristiche – Le librerie come lxml forniscono funzionalità aggiuntive come il supporto XPath.

  • Migliore analisi HTML5 – BeautifulSoup può occasionalmente avere problemi con HTML malformato e moderno.

  • API più semplici – Le librerie come Parsel offrono API Pythoniche più intuitive.

  • multi-threading – Alcuni parser alternativi consentono l'analisi multi-thread per sfruttare più core della CPU.

  • Conformità agli standard – Potrebbe essere necessario un parser che segua rigorosamente le specifiche HTML.

  • Installazione più semplice – BS4 ha alcune dipendenze C che possono causare problemi di installazione, in particolare su sistemi con restrizioni come AWS Lambda. Le alternative con codice Python puro possono essere distribuite più facilmente.

Quindi, sebbene BS4 rimanga un’ottima scelta, vale la pena prendere in considerazione altre eccellenti opzioni. Diamo un'occhiata ad alcune delle migliori alternative BeautifulSoup per l'analisi HTML e il web scraping in Python!

lxml – Veloce come un fulmine

Una delle alternative più popolari e potenti a BeautifulSoup è lxml. La libreria lxml fornisce un'API estremamente veloce e ricca di funzionalità per l'analisi di HTML e XML con Python.

Nei benchmark, lxml supera costantemente BeautifulSoup con margini significativi. Non è raro vederlo Miglioramenti della velocità di 10-100 volte quando si utilizza lxml per l'analisi HTML anziché BeautifulSoup.

Ciò rende lxml uno strumento essenziale per chiunque effettui lo scraping di siti di grandi dimensioni o l'analisi di enormi documenti HTML. I vantaggi in termini di velocità consentono di analizzare il markup in modo molto più efficiente e di ridurre i costi per lo scraping con filetti pesanti.

Alcuni vantaggi chiave di lxml:

  • Incredibile velocità di analisi XML e HTML
  • Supporto per documenti molto grandi
  • Supporto XPath 1.0 per query sofisticate
  • Supporto del selettore CSS simile a BeautifulSoup
  • Threading più semplice: lxml rilascia GIL in modo da consentire l'analisi multi-thread
  • Supporto per l'analisi HTML5

Esaminiamo un rapido esempio per vedere lxml in azione:

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)

Questo semplice esempio dimostra la velocità di lxml: può analizzare ed eseguire query su un'intera pagina di Wikipedia in millisecondi!

Alcuni aspetti negativi da considerare su lxml:

  • Curva di apprendimento più complicata di BeautifulSoup. Le query XPath hanno una curva di apprendimento più ripida rispetto ai selettori CSS.
  • Nessun rilevamento della codifica integrato come BS4.
  • Nessuna rappresentazione di oggetti Python di elementi come BS4. La manipolazione viene eseguita tramite le API di navigazione DOM.

Tuttavia, per la maggior parte del web scraping di produzione, lxml è una parte essenziale del tuo toolkit. I guadagni di velocità ti consentono di raccogliere molti più dati in modo molto più efficiente.

parsel – lxml, semplificato

Se ti piace ciò che lxml porta in tavola ma trovi l'API troppo complessa, dai un'occhiata pacco.

Parsel fornisce un'API più pitonica e più facile da usare racchiudendo lxml e fornendo un'interfaccia basata su selettore per estrarre dati da HTML/XML.

Il vantaggio principale del parsel è semplicità e leggibilità. Parsel è stato progettato da zero pensando al web scraping, mentre lxml supporta una gamma molto più ampia di funzionalità di analisi XML.

Rispetto a lxml, parsel offre:

  • Espressioni di selezione CSS semplificate
  • Gestione automatica della codifica
  • API di estrazione di attributi e testo molto più semplici
  • Approccio più intuitivo nel complesso

Ad esempio, ecco come estrarre testo e attributi utilizzando i selettori parsel:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/it/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 risulterà molto familiare a chiunque provenga da BeautifulSoup o jQuery. Ma ottieni tutti i vantaggi prestazionali di lxml sotto il cofano!

Nel complesso parsel è una scelta eccellente quando si desidera un'interfaccia di scraping semplice e intuitiva ma non si vuole sacrificare la velocità o i vantaggi di compatibilità di lxml.

html5lib – Analisi conforme agli standard

Una delle alternative più interessanti di BeautifulSoup è html5lib.

html5lib è unico perché analizza l'HTML esattamente come fa un browser Web moderno. Si avvicina rigorosamente alle specifiche HTML e produce un modello di oggetti di documento che aderisce strettamente alle specifiche DOM W3C ufficiali.

I vantaggi di html5lib includono:

  • Analisi HTML fedele e conforme alle regole del browser HTML5
  • Gestione elegante del markup non valido nel mondo reale
  • Installazione semplice poiché implementata esclusivamente in Python
  • Può fungere da sostituto immediato di BS4 nella maggior parte dei casi
  • Altamente personalizzabile ed estensibile

Diamo un'occhiata all'utilizzo di base di 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>

Possiamo vedere che html5lib produce un oggetto DOM standard dal documento.

Uno svantaggio è che html5lib è più lento di qualcosa come lxml. Ma è un'ottima scelta quando hai bisogno di un parser in grado di gestire anche markup non valido in modo compatibile con il browser.

Parser HTML Python alternativi

Sebbene lxml, parsel e html5lib siano tra le alternative BeautifulSoup più efficaci, ci sono alcune altre opzioni:

  • PyQuery – Manipolazione DOM in stile jQuery.
  • BellaSoup4 – L'originale BeautifulSoup. API più lenta ma molto accessibile.
  • HTMLParser – Parser HTML integrato in Python.
  • htmlmin – Per minimizzare l'HTML.
  • MarkupSafe – Implementa un parser HTML/XML che espone markup come oggetti Python.

Queste librerie soddisfano diverse esigenze di analisi. PyQuery, ad esempio, fornisce la manipolazione DOM in stile jQuery. BeautifulSoup4 rimane popolare grazie alla sua semplice API.

Esistono anche collegamenti Python per parser HTML veloci come Oca ed jveloce che sfruttano altri motori di analisi sottostanti ad alta velocità.

Sebbene non sia un sostituto diretto, per le attività di analisi di base può funzionare anche HTMLParser integrato di Python.

Il punto è: non limitarti solo a BeautifulSoup. Valuta le tue esigenze rispetto ai numerosi strumenti di analisi disponibili.

Come si confrontano i parser nei benchmark

Per dimostrare le differenze di prestazioni, confrontiamo alcune operazioni comuni utilizzando BeautifulSoup, lxml, html5lib e HTMLParser di Python.

Ho creato un semplice script di riferimento che cronometra vari parser su 3 attività:

  1. Analisi di una pagina HTML di Wikipedia da ~3KB
  2. Trovare tutti i collegamenti
  3. Trovare elementi specifici

Ed ecco i risultati sul mio portatile:

parserAnalizzare il tempoTrova tutti i collegamentiTrova elemento
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
bellazuppa12ms18ms1ms
HTMLParser4ms32ms0.5ms

Come previsto, lxml è estremamente veloce: 10 volte più veloce di html5lib in alcune operazioni. Sorprendentemente HTMLParser resiste all'analisi di base ma inizia a rallentare durante l'interrogazione degli elementi.

Questi parametri di riferimento su un piccolo documento accentuano le differenze. Le lacune diventerebbero ancora più ampie su documenti HTML più grandi in cui la velocità di lxml brilla davvero.

Esempi del mondo reale

Esaminiamo ora alcuni esempi reali utilizzando questi parser alternativi per attività di web scraping:

Raschiare elenchi di prodotti con lxml

Qui estrarremo alcuni elenchi di prodotti da un sito di e-commerce. Lxml semplifica il lavoro di estrazione di tutti i dati di cui abbiamo bisogno:

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)   

Con lxml possiamo analizzare rapidamente anche documenti HTML di grandi dimensioni e utilizzare query XPath succinte per estrarre tutti i dati di cui abbiamo bisogno.

Raschiare tabelle con panda e html5lib

Diciamo che dobbiamo raschiare le tabelle HTML in un DataFrame panda. Html5lib analizza le tabelle in modo affidabile:

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

L'aderenza agli standard di Html5lib garantisce che lo scraping della tabella funzioni in modo coerente anche in caso di markup problematico.

Raschiare il testo con parsel

Per le pagine ricche di testo, parsel semplifica l'estrazione:

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 ci offre la semplicità di BeautifulSoup unita alla velocità di lxml!

Criteri per la scelta di una libreria di parsing HTML

Nel valutare tutte queste alternative a BeautifulSoup, quali criteri sono più importanti per il tuo progetto?

  • Velocità – Se le prestazioni sono fondamentali, lxml è difficile da battere.

  • Correttezza – Per un'analisi affidabile delle pagine problematiche, html5lib brilla.

  • Set di funzionalità – Lxml fornisce una navigazione DOM più completa e supporto XPath.

  • API familiare – I selettori CSS di BeautifulSoup sono i più facili da imparare.

  • Gestione del markup non valido – Lxml e html5lib gestiscono l'HTML del mondo reale in modo più robusto.

  • Conformità agli standard – Html5lib ha la più stretta aderenza al comportamento del browser HTML5.

  • Facilità d'uso – Parsel e PyQuery offrono le API di scraping più semplici.

Non esiste un unico parser migliore per tutti gli scenari. Analizza i tuoi requisiti specifici e i casi d'uso per decidere cosa è ottimale.

Spesso è meglio utilizzare una combinazione di librerie, ad esempio html5lib per analizzare e lxml per eseguire query. Prova diverse opzioni su pagine di esempio per avere un'idea di ciò che funziona bene e in modo affidabile per le tue particolari esigenze di web scraping.

Eliminazione del parser per il web scraping

Ci siamo concentrati sulle librerie di analisi HTML qui. Ma vale la pena notare che esistono alternative completamente all'approccio di analisi.

È possibile estrarre dati senza un parser HTML utilizzando:

  • Espressioni regolari – Regex può essere utilizzato per abbinare modelli HTML grezzi ed estrarre dati. Fragile ma a volte praticabile per casi semplici.
  • Operazioni sulle stringhe – Utilizzare i metodi delle stringhe Python per trovare, dividere e suddividere le stringhe HTML.
  • Richieste HTTP – Effettua richieste direttamente alle API e ottieni risposte API.
  • Automazione del browser – Sfrutta strumenti come Selenium per raschiare il contenuto JavaScript renderizzato.
  • Converti in formati come JSON/XML – Raschia feed di dati strutturati anziché HTML.

Questi approcci possono essere utili ma in genere non sono scalabili o non funzionano in modo affidabile, soprattutto per i siti complessi. Generalmente le librerie di analisi HTML sono consigliate per la robustezza.

Ma se le tue pagine sono estremamente semplici o hai bisogno del rendering JS, potrebbe essere sufficiente un approccio senza parser.

Punti chiave

Sebbene Beautiful Soup risolva molte comuni esigenze di analisi HTML, alternative come lxml, parsel e html5lib meritano di essere prese in considerazione:

  • Lxml – Il gold standard per velocità e prestazioni. Ideale per il web scraping su scala di produzione.

  • pacco – API semplice per un facile scraping. Si basa sulla velocità lxml.

  • html5lib – Analisi compatibile con il browser per garantire precisione e aderenza agli standard.

  • Parametri di riferimento – Lxml è fino a 100 volte più veloce di html5lib in alcune operazioni.

  • Criteri – Velocità vs leggibilità vs correttezza. Valuta i compromessi per il tuo caso d'uso.

  • Nessun analizzatore – Per i casi semplici, le operazioni regex/string possono funzionare.

Non limitarti solo a BeautifulSoup: l'ecosistema Python offre una straordinaria varietà di funzionalità di analisi HTML. Approfitta degli strumenti giusti per ogni lavoro!

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *