AI-agenten · Les

HTML parsen met BeautifulSoup

find(), select(), CSS-selectors en gestructureerde inhoud uit HTML halen.

Les 2 van 413 stappen

HTML parsen met BeautifulSoup is een gratis AI-agenten-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI-agenten. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI-agenten bevat in totaal 4 lessen.

Waarom HTML in agents parseren?

Veel gegevensbronnen zijn geen API's — het zijn webpagina's. Wanneer een agent gestructureerde informatie uit HTML moet halen, moet deze de onbewerkte mark-up parseren tot een doorzoekbare boom.

BeautifulSoup (bs4) is hiervoor de standaard Python-bibliotheek. Deze zet rommelige HTML om in een Python-object dat je eenvoudig kunt bevragen.

Een BeautifulSoup-object maken

Geef onbewerkte HTML en een parsernaam door aan BeautifulSoup(). 'html.parser' is ingebouwd in Python en vereist geen extra installatie. Voor sneller parseren van grote pagina's is 'lxml' beschikbaar via pip.

from bs4 import BeautifulSoup
import httpx

# Fetch HTML
response = httpx.get('https://example.com', timeout=10.0)
html = response.text

# Parse it
soup = BeautifulSoup(html, 'html.parser')

# Get the page title
print(soup.title.text)  # 'Example Domain'

find() — Eén element vinden

soup.find(tag, attrs) retourneert het eerste overeenkomende element, of None als er geen overeenkomst is. Je kunt zoeken op tagnaam, klasse, id of elk attribuut.

Controleer altijd op None voordat je methoden op het resultaat aanroept.

from bs4 import BeautifulSoup

html = '<div class="content"><h1>Title</h1><p>Body text here.</p></div>'
soup = BeautifulSoup(html, 'html.parser')

# Find by tag + class
content_div = soup.find('div', class_='content')
if content_div:
    heading = content_div.find('h1')
    print(heading.text)  # 'Title'

# Find by id
sidebar = soup.find('div', id='sidebar')  # None if absent

find_all() — Meerdere elementen vinden

soup.find_all(tag) retourneert een lijst met alle overeenkomende elementen. Loop over deze lijst om gegevens uit herhaalde structuren te halen, zoals lijstitems, tabelrijen of artikelkaarten.

from bs4 import BeautifulSoup

html = '<ul><li>Apple</li><li>Banana</li><li>Cherry</li></ul>'
soup = BeautifulSoup(html, 'html.parser')

items = soup.find_all('li')
for item in items:
    print(item.text)  # Apple, Banana, Cherry

# Limit results
first_two = soup.find_all('li', limit=2)

CSS-selectors met select()

Met soup.select('css selector') kun je vertrouwde CSS-syntaxis gebruiken. Dit is vaak beknopter dan gekoppelde aanroepen van find(), vooral voor geneste elementen.

from bs4 import BeautifulSoup

html = '''
<table>
  <tr><td class="name">Alice</td><td class="score">95</td></tr>
  <tr><td class="name">Bob</td><td class="score">87</td></tr>
</table>
'''
soup = BeautifulSoup(html, 'html.parser')

# Select all td elements inside tr inside table
cells = soup.select('table tr td')
for cell in cells:
    print(cell.text)

# Select only name cells
names = soup.select('td.name')
for n in names:
    print(n.text)  # Alice, Bob

Tekst extraheren met .text en .strip()

.text (of .get_text()) retourneert alle tekstinhoud binnen een element, inclusief geneste tags. Gebruik .strip() om voorloop- en volgspaties te verwijderen, die HTML vaak bevat.

from bs4 import BeautifulSoup

html = '<p>  \n  Price: <strong>$29.99</strong>  \n  </p>'
soup = BeautifulSoup(html, 'html.parser')

paragraph = soup.find('p')

# .text includes nested tag content
print(paragraph.text)          # '  \n  Price: $29.99  \n  '
print(paragraph.text.strip())  # 'Price: $29.99'

# get_text with separator
print(paragraph.get_text(separator=' ', strip=True))  # 'Price: $29.99'

Attributen extraheren met .get()

Tagattributen zoals href, src en data-* kun je benaderen alsof het een woordenboek is met .get('attr_name'). Dit geeft veilig None terug als het attribuut ontbreekt.

from bs4 import BeautifulSoup

html = '''
<a href="https://example.com/page" data-id="42">Click here</a>
<img src="/images/logo.png" alt="Logo">
'''
soup = BeautifulSoup(html, 'html.parser')

link = soup.find('a')
print(link.get('href'))     # 'https://example.com/page'
print(link.get('data-id'))  # '42'
print(link.get('class'))    # None (no class attribute)

img = soup.find('img')
print(img.get('src'))       # '/images/logo.png'

Door de parseeerboom navigeren

BeautifulSoup-elementen hebben relaties met bovenliggende, onderliggende en aangrenzende elementen die je kunt doorlopen. Gebruik .parent, .children, .next_sibling en .previous_sibling om rond een gevonden element te navigeren.

from bs4 import BeautifulSoup

html = '''
<div class="article">
  <h2>Headline</h2>
  <p>First paragraph.</p>
  <p>Second paragraph.</p>
</div>
'''
soup = BeautifulSoup(html, 'html.parser')

h2 = soup.find('h2')
print(h2.text)                    # 'Headline'
print(h2.parent['class'])         # ['article']
print(h2.next_sibling.next_sibling.text)  # 'First paragraph.'

Alle koppelingen van een pagina extraheren

Een veelvoorkomende taak voor een agent is alle koppelingen van een pagina verzamelen om ze verder te doorzoeken. Zoek alle <a>-tags en extraheer hun href-attributen, waarbij je lege waarden wegfiltert.

from bs4 import BeautifulSoup
import httpx

def extract_links(url: str) -> list:
    response = httpx.get(url, timeout=10.0)
    soup = BeautifulSoup(response.text, 'html.parser')

    links = []
    for tag in soup.find_all('a'):
        href = tag.get('href')
        if href and href.startswith('http'):
            links.append(href)
    return links

# urls = extract_links('https://news.ycombinator.com')
# print(urls[:5])

Gebrekkige HTML netjes verwerken

HTML uit de praktijk is vaak gebrekkig: niet-gesloten tags, niet-overeenkomende elementen en coderingsproblemen. De parser van BeautifulSoup is vergevingsgezind en probeert fouten automatisch te herstellen. Bescherm je echter altijd tegen None wanneer je geneste elementen benadert.

from bs4 import BeautifulSoup

# Broken HTML — missing closing tags
html = '<div><p>Hello <strong>World</div>'
soup = BeautifulSoup(html, 'html.parser')

# BS4 repairs the tree automatically
print(soup.prettify())
# <div><p>Hello <strong>World</strong></p></div>

# Safe chained access
price = soup.find('span', class_='price')
price_text = price.text.strip() if price else 'N/A'
print(price_text)  # 'N/A'

Complete scrapingtool voor agents

Alles samen: een complete scraperfunctie die een agent als tool kan aanroepen. De functie haalt een pagina op, parseert deze en retourneert gestructureerde gegevens in een indeling waarover de agent kan redeneren.

from bs4 import BeautifulSoup
import httpx

def scrape_article(url: str) -> dict:
    response = httpx.get(url, headers={'User-Agent': 'MyAgent/1.0'}, timeout=10.0)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, 'html.parser')

    title = soup.find('h1')
    paragraphs = soup.find_all('p')

    return {
        'url': url,
        'title': title.text.strip() if title else '',
        'text': ' '.join(p.text.strip() for p in paragraphs[:5]),
        'links': [a.get('href') for a in soup.find_all('a', href=True)][:10]
    }

Kennistoets: BeautifulSoup

Test je begrip van HTML-parsing met BeautifulSoup.

Samenvatting: HTML parsen met BeautifulSoup

Je kunt nu gestructureerde gegevens uit HTML-pagina's halen in je agents:

  • Maak een soup-object met BeautifulSoup(html, 'html.parser')
  • Gebruik find() voor één element en find_all() voor meerdere elementen
  • Gebruik select() voor zoekopdrachten met CSS-selectors
  • Haal tekst op met .text.strip() en attributen met .get('attr')
  • Navigeer door de boomstructuur met .parent, .children en broers en zussen

In combinatie met een HTTP-client geeft BeautifulSoup je agent de mogelijkheid om elke webpagina te lezen.

Gratis beginnen

Leer AI-agenten met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
60
Lessen
239

Veelgestelde vragen

Is de les “HTML parsen met BeautifulSoup” gratis?

Ja — de volledige tekst van “HTML parsen met BeautifulSoup” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus AI-agenten wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus AI-agenten bevat in totaal 4 lessen.

Wat leer ik in “HTML parsen met BeautifulSoup”?

find(), select(), CSS-selectors en gestructureerde inhoud uit HTML halen. Je oefent met AI-agenten door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met AI-agenten te beginnen?

Ervaring vooraf is niet nodig. AI-agenten op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “HTML parsen met BeautifulSoup”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over AI-agenten?

Ja. Elke les over AI-agenten bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. HTTP-clients voor agents: httpx en requests
  2. HTML parsen met BeautifulSoup
  3. Paginering en dynamische inhoud verwerken
  4. Respectvol scrapen
← Terug naar AI-agenten