Meteen naar de inhoud

Hoe HTML in tekst omzetten in Python?

Hier is een blogpost van meer dan 2000 woorden over "Hoe HTML in tekst om te zetten in Python?":

HTML is een belangrijk formaat voor het opslaan en weergeven van gegevens op internet. Bij webscrapen willen we vaak alleen de zichtbare tekstinhoud uit HTML-pagina's halen. In dit bericht zal ik verschillende technieken onderzoeken voor het converteren van HTML naar schone tekst in Python.

Waarom HTML naar tekst converteren?

Er zijn een paar belangrijke redenen waarom u HTML-tags wilt verwijderen en alleen de tekst wilt extraheren:

  • Vereenvoudig geschraapte inhoud – Bij het scrapen van webpagina's bevat de HTML meestal veel extra markeringen en elementen die we niet nodig hebben, zoals navigatielinks. Door de hoofdtekst te extraheren, wordt de inhoud gemakkelijker te analyseren en ermee te werken.

  • Opmaak verwijderen – HTML past visuele opmaak en lay-out toe. Voor veel toepassingen, zoals sentimentanalyse, willen we alleen de tekstinhoud zonder enige opmaak.

  • Opslaan in een tekstformaat – Het kan handig zijn om alleen de tekst uit HTML te extraheren, zodat deze in een eenvoudig formaat kan worden opgeslagen, zoals een tekstbestand of in een tekstveld in een database. Hiermee worden alle omvangrijke HTML-opmaak verwijderd.

  • leesbaarheid – De onbewerkte HTML is voor mensen moeilijk te lezen en te interpreteren. Het converteren naar tekst maakt het beter leesbaar.

  • Toegankelijkheid – Inhoud met platte tekst is beter toegankelijk voor schermlezers die worden gebruikt door visueel gehandicapte gebruikers.

  • Indexering van zoekmachines – Zoekmachines analyseren en indexeren grotendeels de zichtbare tekstinhoud van pagina’s. Het converteren van HTML naar tekst kan helpen bij het analyseren van inhoud, vergelijkbaar met hoe zoekmachines deze zien.

Samenvattend is het extraheren van tekst uit HTML nuttig voor scraping, analyse, opslag en toegankelijkheid. In de volgende secties worden verschillende manieren besproken om dit in Python te bereiken.

HTML-tags verwijderen met BeautifulSoup

Beautiful Soup is een populaire Python-bibliotheek voor webscraping en het parseren van HTML. We kunnen het gebruiken om vrij eenvoudig tekst uit HTML te extraheren.

De eenvoudigste methode is om de get_text() methode op een BeautifulSoup-object of een element geselecteerd uit de geparseerde HTML. Bijvoorbeeld:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

soup = BeautifulSoup(html, "html.parser")

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

Hiermee worden alle HTML-tags verwijderd en wordt een tekenreeks geretourneerd die de zichtbare tekst bevat.

Een ding om op te merken is dat get_text() standaard worden ook meerdere opeenvolgende witruimtetekens gecomprimeerd tot één enkele spatie. Doorgang strip=False om witruimte zoals nieuwe regels en extra spaties te behouden:

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

Als u tekst uit slechts een deel van de HTML wilt extraheren, belt u get_text() op een element in plaats van op het hele document:

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

Eén kanttekening is dat get_text() zal nog steeds alle tekst bevatten die is genest in onderliggende elementen zoals links. Om die er ook uit te halen, geef je a door recursive=False argument:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

Met BeautifulSoup kunnen we dus gemakkelijk aan de slag get_text() om zichtbare tekst uit HTML te extraheren.

Tekst extraheren met lxml

lxml is een andere populaire Python-bibliotheek voor het parseren van XML en HTML. We kunnen het ook gebruiken om tekst te extraheren.

Van een lxml HTMLParser element, bel de text_content() methode om de tekst te verkrijgen:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

Hierdoor wordt recursief alle tekst geëxtraheerd, inclusief onderliggende elementen. Om tekst van kinderen uit te sluiten, geeft u a door children=False argument:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

Dus lxml biedt ook een eenvoudige manier om HTML te strippen en alleen de tekstinhoud te verkrijgen.

Normale uitdrukkingen

Een op regex gebaseerde aanpak kan ook worden gebruikt om HTML-tags te verwijderen. Dit omvat het gebruik van een patroon om alle HTML-tags te matchen, en vervangingen om ze door niets te vervangen:

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

de regex r"<[^>]*>" lucifers < gevolgd door alles behalve > een of meerdere keren, gevolgd door >. De re.sub() call verwijdert deze overeenkomsten, waardoor effectief alle HTML-tags worden verwijderd.

Om ook om te gaan met XML-naamruimten en zelfsluitende tags:

clean = re.sub(r"<[^>]+>", "", html)

Dit is een snelle en eenvoudige op regex gebaseerde aanpak om alle HTML-tags te verwijderen. Hoewel het niet dezelfde controle en eenvoud biedt als specifieke HTML-parseerbibliotheken zoals BeautifulSoup en lxml.

Codering verwerken

Webpagina's kunnen worden gecodeerd in verschillende tekstformaten, zoals ASCII, UTF-8 of ISO-8859-1. Bij het schrapen van pagina's willen we de codering detecteren en correct decoderen naar Unicode-tekst.

De chardet bibliotheek kan automatisch codering voor ons detecteren:

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

We kunnen de HTML-bytes vervolgens expliciet decoderen naar een Unicode-tekenreeks voordat we de tekst parseren en extraheren.

Bij het converteren van HTML naar tekst moet eerst de codering worden afgehandeld voordat er wordt geparseerd om coderingsfouten te voorkomen.

Volledig HTML naar tekstvoorbeeld

Hier is een voorbeeld waarin de stappen zijn samengesteld om op robuuste wijze tekst uit HTML te extraheren:

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

Dit zorgt voor de coderingsdetectie, het verwijderen van tags en het extraheren van tekst in een herbruikbare functie.

Er zijn ook Python-bibliotheken zoals uittreksel die een deel van deze functionaliteit inkapselen voor het converteren van verschillende bestandsformaten naar tekst.

HTML-entiteiten converteren

Een ander probleem waar we tegenaan kunnen lopen is HTML die gebruik maakt van karakterentiteiten zoals   en & in plaats van letterlijke karakters.

We kunnen de html.unescape() functie van de Python-standaard html-bibliotheek om entiteiten terug naar karakters te converteren:

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

Dit kan vóór of na het extraheren van tekst uit HTML worden gedaan.

JavaScript verwerken

Een beperking van de bovenstaande technieken is dat ze alleen zichtbare tekst uit de initiële HTML halen. Tekst die dynamisch door JavaScript wordt toegevoegd, wordt niet vastgelegd.

Om JavaScript uit te voeren en de volledige tekst weer te geven, moeten we een headless browser zoals Selenium or Toneelschrijver:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

Hier wordt Playwright gebruikt om de pagina te laden en JavaScript uit te voeren, waardoor we de volledige tekst kunnen extraheren.

Voor pagina's met zware JS-manipulatie kan een browserautomatiseringstool nodig zijn als we de volledig weergegeven tekst nodig hebben.

Samengevat

Er zijn een paar hoofdtechnieken om HTML naar platte tekst in Python te converteren:

  • Te gebruiken get_text() van MooiSoep
  • Inhoud extraheren met text_content() in lxml
  • Verwijder tags met reguliere expressies
  • Decodeer eventuele coderingen voordat u gaat parseren
  • Behandel HTML-entiteiten met html.unescape()
  • Gebruik een headless browser als JavaScript moet worden uitgevoerd

Het converteren van HTML naar tekst is handig voor het vereenvoudigen van geschraapte inhoud, het analyseren van tekst in plaats van markeringen, het verbeteren van de leesbaarheid en toegankelijkheid, het indexeren door zoekmachines en het opslaan in een lichtgewicht formaat.

Ik hoop dat dit bericht een uitgebreide handleiding heeft gegeven voor de belangrijkste manieren om tekst uit HTML te extraheren met Python! Laat het me weten als je nog andere nuttige technieken hebt.

Doe mee aan het gesprek

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