Meteen naar de inhoud

Wat zijn enkele BeautifulSoup-alternatieven voor HTML-parsering in Python?

Als Python-ontwikkelaar bent u waarschijnlijk bekend met BeautifulSoup (ook wel BS4 genoemd) – de eerbiedwaardige HTML/XML-parseerbibliotheek die al meer dan tien jaar een belangrijk onderdeel is van Python-webscraping.

Maar je bent je er misschien niet van bewust dat Beautiful Soup tegenwoordig verre van de enige optie is om HTML in Python te parseren. Er zijn zelfs een verrassend aantal capabele BeautifulSoup-alternatieven die in sommige gevallen zelfs BS4 overtreffen in functionaliteit en prestaties.

In deze uitgebreide handleiding verkennen we enkele van de meest populaire en krachtige BeautifulSoup-alternatieven voor het schrapen en parseren van HTML met Python.

Waarom BeautifulSoup-alternatieven overwegen?

Voordat je in de opties duikt, vraag je je misschien af: waarom überhaupt alternatieven overwegen?

Hier zijn enkele redenen waarom u misschien verder wilt kijken dan BeautifulSoup voor uw Python-webscraping-projecten:

  • Betere prestaties – Sommige nieuwere parsers presteren aanzienlijk beter dan BS4 in benchmarks. Snelheid is van cruciaal belang bij het schrapen van grote sites.

  • meer functies – Bibliotheken zoals lxml bieden extra mogelijkheden zoals XPath-ondersteuning.

  • Betere HTML5-parsering – BeautifulSoup kan af en toe worstelen met misvormde en moderne HTML.

  • Gemakkelijkere API's – Bibliotheken zoals parsel bieden intuïtievere, Pythonische API's.

  • Multi-threading – Sommige alternatieve parsers maken parsing met meerdere threads mogelijk om te profiteren van meerdere CPU-kernen.

  • Naleving van normen – Mogelijk hebt u een parser nodig die de HTML-specificaties strikt volgt.

  • Gemakkelijkere installatie – BS4 heeft enkele C-afhankelijkheden die installatieproblemen kunnen veroorzaken, vooral op beperkte systemen zoals AWS Lambda. Alternatieven met pure Python-code kunnen eenvoudiger worden geïmplementeerd.

Dus hoewel BS4 een goede keuze blijft, zijn andere uitstekende opties het overwegen waard. Laten we eens kijken naar enkele van de beste BeautifulSoup-alternatieven voor HTML-parsing en webscraping in Python!

lxml – Bliksemsnel

Een van de meest populaire en krachtige BeautifulSoup-alternatieven is lxml. De lxml-bibliotheek biedt een extreem snelle, veelzijdige API voor het parseren van HTML en XML met Python.

In benchmarks presteert lxml consequent met aanzienlijke marges beter dan BeautifulSoup. Het is niet ongewoon om te zien 10-100x snelheidsverbeteringen bij gebruik van lxml voor HTML-parsering in plaats van BeautifulSoup.

Dit maakt lxml een essentieel hulpmiddel voor iedereen die grote sites scrapt of enorme HTML-documenten parseert. Dankzij de snelheidsvoordelen kunt u markeringen veel efficiënter parseren en de kosten voor schrapen met veel threads verlagen.

Enkele belangrijke voordelen van lxml:

  • Razendsnelle XML- en HTML-parseersnelheid
  • Ondersteuning voor zeer grote documenten
  • XPath 1.0-ondersteuning voor geavanceerde query's
  • Ondersteuning voor CSS-selector vergelijkbaar met BeautifulSoup
  • Gemakkelijker threaden – lxml geeft de GIL vrij, zodat parseren met meerdere threads mogelijk is
  • Ondersteuning voor HTML5-parsing

Laten we een kort voorbeeld bekijken om lxml in actie te zien:

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)

Dit eenvoudige voorbeeld demonstreert de snelheid van lxml: het kan een volledige Wikipedia-pagina in milliseconden parseren en doorzoeken!

Enkele nadelen waarmee u rekening moet houden bij lxml:

  • Lastiger leercurve dan BeautifulSoup. XPath-query's hebben een steilere leercurve dan CSS-selectors.
  • Geen ingebouwde coderingsdetectie zoals BS4.
  • Geen Pythonische objectrepresentatie van elementen zoals BS4. Manipulatie gebeurt via DOM-navigatie-API's.

Toch is lxml voor de meeste productiewebscraping een essentieel onderdeel van uw toolkit. Dankzij de snelheidswinst kunt u veel efficiënter gegevens verzamelen.

parsel – lxml, vereenvoudigd

Als je het leuk vindt wat lxml te bieden heeft, maar de API te complex vindt, ga dan eens kijken perceel.

Parsel biedt een eenvoudiger te gebruiken, meer Python-achtige API door lxml in te pakken en een op selector gebaseerde interface te bieden voor het schrapen van gegevens uit HTML/XML.

Het belangrijkste voordeel van parsel is eenvoud en leesbaarheid. Parsel is vanaf de basis ontworpen met webscraping in gedachten, terwijl lxml een veel breder scala aan XML-parseerfunctionaliteit ondersteunt.

Vergeleken met lxml biedt parsel:

  • Vereenvoudigde CSS-selectorexpressies
  • Automatische coderingsafhandeling
  • Veel eenvoudigere API's voor attribuut- en tekstextractie
  • Over het algemeen een meer intuïtieve aanpak

Hier ziet u bijvoorbeeld hoe u tekst en attributen extraheert met behulp van parselselectors:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/nl/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

DeSelector API zal zeer bekend zijn voor iedereen die afkomstig is van BeautifulSoup of jQuery. Maar je krijgt alle prestatievoordelen van lxml onder de motorkap!

Over het algemeen is parsel een uitstekende keuze als u een eenvoudige en intuïtieve scrapinterface wilt, maar de snelheids- of compatibiliteitsvoordelen van lxml niet wilt opofferen.

html5lib – Parseren conform standaarden

Een van de coolste BeautifulSoup-alternatieven is html5lib.

html5lib is uniek omdat het HTML parseert op precies dezelfde manier als een moderne webbrowser dat doet. Het benadert de HTML-specificaties rigoureus en levert een documentobjectmodel op dat nauw aansluit bij de officiële W3C DOM-specificatie.

Voordelen van html5lib zijn onder meer:

  • Betrouwbare en compatibele HTML-parsering volgens HTML5-browserregels
  • Sierlijke afhandeling van onjuist opgemaakte markeringen in de echte wereld
  • Eenvoudige installatie omdat het puur in Python is geïmplementeerd
  • Kan in de meeste gevallen dienen als drop-in vervanging voor BS4
  • Zeer aanpasbaar en uitbreidbaar

Laten we eens kijken naar het basisgebruik van 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>

We kunnen zien dat html5lib een standaard DOM-object uit het document produceert.

Een nadeel is dat html5lib langzamer is dan zoiets als lxml. Maar het is een uitstekende keuze als u een parser nodig heeft die zelfs verkeerd opgemaakte markeringen op een browsercompatibele manier kan verwerken.

Alternatieve Python HTML-parsers

Hoewel lxml, parsel en html5lib tot de meest capabele BeautifulSoup-alternatieven behoren, zijn er een paar andere opties:

  • PyQuery – DOM-manipulatie in jQuery-stijl.
  • MooiSoep4 – De OG BeautifulSoep. Langzamere maar zeer toegankelijke API.
  • HTMLParser – De ingebouwde HTML-parser van Python.
  • htmlmin – Voor het verkleinen van HTML.
  • MarkupSafe – Implementeert een HTML/XML-parser die markeringen blootstelt als Python-objecten.

Deze bibliotheken voorzien in verschillende paringsbehoeften. PyQuery biedt bijvoorbeeld jQuery-achtige DOM-manipulatie. BeautifulSoup4 blijft populair vanwege de eenvoudige API.

Er zijn ook Python-bindingen voor snelle HTML-parsers zoals Gans en jsnel die gebruik maken van andere onderliggende snelle parseermotoren.

Hoewel het geen directe vervanging is, kan de ingebouwde HTMLParser van Python voor basisparseringstaken ook werken.

Het punt is: beperk jezelf niet tot alleen maar BeautifulSoup. Evalueer uw behoeften aan de hand van de vele beschikbare parseerhulpmiddelen.

Hoe de parsers zich verhouden in benchmarks

Laten we, om de prestatieverschillen aan te tonen, een aantal veelvoorkomende bewerkingen vergelijken met behulp van BeautifulSoup, lxml, html5lib en Python's HTMLParser.

Ik heb een simpel benchmark-script dat keert verschillende parsers op 3 taken:

  1. Een Wikipedia HTML-pagina van ~3 KB parseren
  2. Alle koppelingen vinden
  3. Het vinden van specifieke elementen

En hier zijn de resultaten op mijn laptop:

parserParseertijdVind alle koppelingenElement zoeken
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
Mooie soep12ms18ms1ms
HTMLParser4ms32ms0.5ms

Zoals verwacht is lxml extreem snel: bij sommige bewerkingen 10x sneller dan html5lib. Verrassend genoeg houdt HTMLParser stand bij het basisparseren, maar begint het te vertragen bij het opvragen van elementen.

Deze benchmarks op een klein document accentueren de verschillen. De gaten zouden zelfs nog groter worden bij grotere HTML-documenten waar de snelheid van lxml echt uitblinkt.

Voorbeelden uit de echte wereld

Laten we nu enkele praktijkvoorbeelden bekijken met behulp van deze alternatieve parsers voor webscraping-taken:

Productvermeldingen schrapen met lxml

Hier schrappen we enkele productvermeldingen van een e-commercesite. Lxml maakt snel werk van het extraheren van alle gegevens die we nodig hebben:

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)   

Met lxml kunnen we zelfs grote HTML-documenten snel parseren en beknopte XPath-query's gebruiken om alle gegevens te extraheren die we nodig hebben.

Tabellen schrapen met panda's en html5lib

Laten we zeggen dat we HTML-tabellen in een Panda DataFrame moeten schrapen. Html5lib parseert tabellen op betrouwbare wijze:

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

De naleving van de standaarden door Html5lib zorgt ervoor dat het schrapen van tabellen consistent werkt, zelfs bij problematische markup.

Tekst schrapen met parsel

Voor pagina's met veel tekst maakt parsel de extractie eenvoudig:

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 geeft ons de eenvoud van BeautifulSoup gecombineerd met de snelheid van lxml!

Criteria voor het kiezen van een HTML-parseerbibliotheek

Welke criteria zijn voor uw project het belangrijkst bij het beoordelen van al deze BeautifulSoup-alternatieven?

  • Speed – Als prestaties van cruciaal belang zijn, is lxml moeilijk te verslaan.

  • Juistheid – Voor betrouwbaar parseren op problematische pagina’s schittert html5lib.

  • Functieset – Lxml biedt completere DOM-navigatie en XPath-ondersteuning.

  • Vertrouwde API – De CSS-selectors van BeautifulSoup zijn het gemakkelijkst te leren.

  • Verkeerd opgemaakte markeringen verwerken – Lxml en html5lib kunnen robuuster met echte HTML omgaan.

  • Conformiteit met normen – Html5lib hanteert de strengste naleving van HTML5-browsergedrag.

  • Gebruiksgemak – Parsel en PyQuery bieden de eenvoudigste scraping-API's.

Er bestaat niet één beste parser voor alle scenario's. Analyseer uw specifieke vereisten en gebruiksscenario's om te beslissen wat optimaal is.

Vaak is het het beste om een ​​combinatie van bibliotheken te gebruiken, bijvoorbeeld html5lib om te parseren en lxml om te bevragen. Test verschillende opties op voorbeeldpagina's om een ​​idee te krijgen van wat goed en betrouwbaar werkt voor uw specifieke webscraping-behoeften.

Parserloos gaan voor webscrapen

We hebben ons hier geconcentreerd op HTML-parseerbibliotheken. Maar het is de moeite waard om op te merken dat er volledig alternatieven zijn voor de parseerbenadering.

Het is mogelijk om gegevens te schrapen zonder een HTML-parser met behulp van:

  • Normale uitdrukkingen – Regex kan worden gebruikt om ruwe HTML-patronen aan te passen en gegevens te extraheren. Bros maar soms werkbaar voor eenvoudige gevallen.
  • String-bewerkingen – Gebruik Python-stringmethoden om HTML-strings te vinden, splitsen en segmenteren.
  • HTTP-verzoeken – Dien rechtstreeks verzoeken in bij API's en verzamel API-reacties.
  • Browser-automatisering – Maak gebruik van tools zoals Selenium om weergegeven JavaScript-inhoud te schrapen.
  • Converteren naar formaten zoals JSON/XML – Schraap gestructureerde datafeeds in plaats van HTML.

Deze benaderingen kunnen nuttig zijn, maar zijn doorgaans niet schaalbaar en werken niet betrouwbaar, vooral niet bij complexe sites. Over het algemeen worden HTML-parseerbibliotheken aanbevolen vanwege de robuustheid.

Maar als uw pagina's uiterst eenvoudig zijn of als u JS-rendering nodig heeft, kan een parserloze aanpak voldoende zijn.

Key Takeaways

Hoewel Beautiful Soup veel voorkomende HTML-parseerbehoeften oplost, zijn alternatieven zoals lxml, parsel en html5lib het overwegen waard:

  • Lxml – De gouden standaard voor snelheid en prestaties. Ideaal voor webscrapen op productieschaal.

  • perceel – Eenvoudige API voor eenvoudig schrapen. Bouwt voort op lxml-snelheid.

  • html5lib – Browser-compatibele parsering voor nauwkeurigheid en naleving van standaarden.

  • benchmarks – Lxml is bij sommige bewerkingen tot 100x sneller dan html5lib.

  • criteria – Snelheid versus leesbaarheid versus correctheid. Evalueer de afwegingen voor uw gebruiksscenario.

  • Geen parser – Voor eenvoudige gevallen kunnen regex/string-bewerkingen werken.

Beperk jezelf niet tot alleen BeautifulSoup: het Python-ecosysteem biedt een verbazingwekkende variëteit aan HTML-parseermogelijkheden. Profiteer van het juiste gereedschap voor elke klus!

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *