In het tijdperk van het internet is een URL (Uniform Resource Locator) het basisadres dat de locatie van informatie aangeeft. In verschillende gebieden zoals webontwikkeling of data-analyse hebben we vaak met URLs te maken, en soms is het nodig om niet de hele URL, maar slechts bepaalde delen (bijvoorbeeld het domein, pad, queryparameters) eruit te halen. In dit geval is de urlparse() functie in de urllib.parse module een krachtig hulpmiddel.

In dit artikel zullen we de basisprincipes van het gebruik van de urlparse() functie behandelen, de betekenis en voorbeelden van de vaak gebruikte .netloc eigenschap verkennen, en de verschillende eigenschappen van het ParseResult object dat door urlparse() wordt geretourneerd, in detail bespreken.


1. Wat is urlparse()?



urlparse() is een functie die een URL-string opsplitst in verschillende componenten volgens de RFC 1738 (Universal Resource Locators in WWW) en RFC 3986 (Uniform Resource Identifier (URI): Generic Syntax) standaarden. Elk van deze componenten wordt verpakt in een speciaal object genaamd ParseResult en weergeven.

Basisgebruik

De urlparse() functie wordt geïmporteerd vanuit de urllib.parse module.

from urllib.parse import urlparse

url = 'https://user:pass@www.example.com:8080/path/to/resource?name=Alice&age=30#section1'
parsed_url = urlparse(url)

print(parsed_url)
# Uitvoer: ParseResult(scheme='https', netloc='user:pass@www.example.com:8080', path='/path/to/resource', params='', query='name=Alice&age=30', fragment='section1')

Het parsed_url object kan worden benaderd via indexen zoals een tuple, of via benoemde eigenschappen (named attributes), waarbij de laatste optie veel beter leesbaar is.


2. Belangrijke eigenschappen van het ParseResult object

Het ParseResult object dat door urlparse() wordt geretourneerd, heeft de volgende eigenschappen.

scheme

  • Betekenis: Dit vertegenwoordigt het protocoldeel van de URL. (http, https, ftp, mailto, etc.)

  • Voorbeeld: 'https'

netloc (Netwerklocatie)

  • Betekenis: Dit deel bevat de hostnaam (domein), poortnummer, en optioneel gebruikersauthenticatie-informatie (user:pass@).

  • Voorbeeld: 'user:pass@www.example.com:8080'

  • Toepassing: Dit is handig voor het extraheren van alleen het domein van een bepaalde webservice of voor het controleren van het poortnummer voor netwerkverbindingen. Dit zal later verder worden behandeld.

path

  • Betekenis: Dit geeft het specifieke pad naar een resource op de webserver aan.

  • Voorbeeld: '/path/to/resource'

params (Padparameters)

  • Betekenis: Dit zijn padparameters die gescheiden zijn door puntkomma's (;). Hoewel dit gedefinieerd is in de RFC, wordt het in de moderne webomgeving vrijwel niet gebruikt en worden voornamelijk querystrings gebruikt.

  • Voorbeeld: ';sessionid=xyz' (zelden gebruikt)

query

  • Betekenis: Dit is de querystring die na het vraagteken (?) komt. Het wordt gebruikt om gegevens in de vorm van sleutel-waardeparen naar de server te verzenden.

  • Voorbeeld: 'name=Alice&age=30'

  • Toepassing: Dit kan eenvoudig worden geparsed in een woordenboekvorm met de urllib.parse.parse_qs() functie.

from urllib.parse import parse_qs
query_params = parse_qs(parsed_url.query)
print(query_params)
# Uitvoer: {'name': ['Alice'], 'age': ['30']}

fragment

  • Betekenis: Dit is de fragmentidentifier die na de hash (#) komt. Dit wordt meestal gebruikt om naar een specifiek gedeelte op een webpagina te navigeren en wordt niet naar de server verzonden, maar alleen door de browser verwerkt.

  • Voorbeeld: 'section1'


3. Diepgaande analyse van de .netloc eigenschap



.netloc is een bijzonder belangrijke eigenschap van de urlparse() resultaten. netloc is een afkorting voor Netwerklocatie en bevat cruciale informatie over het adres van de webserver in de URL.

netloc componenten

netloc kan bestaan uit de volgende elementen.

  • Gebruikersinformatie (Userinfo): Dit kan de gebruikersnaam en het wachtwoord in de vorm van user:password@ bevatten. Wegens veiligheidsredenen wordt dit in reguliere web-URL's bijna nooit gebruikt, maar kan het in andere protocollen zoals FTP voorkomen.

  • Host: Dit is de domeinnaam (www.example.com) of het IP-adres (192.168.1.1).

  • Poort: Dit is het poortnummer dat achter de : komt. Wanneer de standaard poorten worden gebruikt, bijvoorbeeld poort 80 voor HTTP en 443 voor HTTPS, kan het poortnummer in netloc weggelaten worden.

Voorbeeld:

URL netloc resultaat Uitleg
https://www.example.com www.example.com Bevat alleen het domein (standaard poort 443 voor HTTPS weggelaten)
http://myhost:8000/app myhost:8000 Bevat host en poort
ftp://user:pass@ftp.example.org user:pass@ftp.example.org Bevat gebruikersinformatie, host

Waarom en in welke scenario's .netloc gebruiken?

  1. Domeinextractie en validatie:

    • Door te controleren van welke website een verzoek komt, kan het netloc worden gebruikt om het domein gemakkelijk te extraheren, waardoor beveiligingsbeleid kan worden toegepast of alleen specifieke domeinen toestaan.

    • Met de parsed_url.hostname eigenschap kan de hostnaam zonder poortnummer uit netloc worden verkregen.

url = 'https://www.example.com:8080/path'
parsed = urlparse(url)
print(parsed.netloc)    # 'www.example.com:8080'
print(parsed.hostname)  # 'www.example.com'
print(parsed.port)      # 8080 (int)
  1. URL reconstructie of wijziging:

    • Hoewel het ParseResult object dat door urlparse() wordt geretourneerd onveranderlijk (immutable) is, kan de .replace() methode worden gebruikt om een nieuw ParseResult object te maken met alleen enkele wijzigingen in de eigenschap. Dit gewijzigde object kan vervolgens opnieuw worden doorgegeven aan de urlunparse() functie om eenvoudig een nieuwe URL te reconstrueren.

    • Bijvoorbeeld, bij het implementeren van een omleiding naar een bepaald domein kan simpelweg netloc worden gewijzigd om de URL te genereren.

from urllib.parse import urlparse, urlunparse

original_url = 'https://old.example.com/data'
parsed_original = urlparse(original_url)

# Genereer nieuwe URL door alleen het domein te wijzigen
new_netloc = 'new.example.com'
modified_parsed = parsed_original._replace(netloc=new_netloc)
new_url = urlunparse(modified_parsed)

print(new_url) # Uitvoer: https://new.example.com/data
  1. Vergelijking van URL-gelijkheid (op basis van domein/poort):

    • Wanneer moet worden vastgesteld of twee URLs naar dezelfde server wijzen, is het nuttig om de netloc eigenschap te vergelijken.
url1 = 'https://api.myapp.com/v1/users'
url2 = 'https://api.myapp.com:443/v2/products' # 443 is de standaardpoort voor HTTPS
url3 = 'https://oldapi.myapp.com/v1/users'

parsed1 = urlparse(url1)
parsed2 = urlparse(url2)
parsed3 = urlparse(url3)

print(parsed1.netloc == parsed2.netloc) # True (de standaardpoort wordt weggelaten en kan als gelijk worden beschouwd)
print(parsed1.hostname == parsed2.hostname) # True
print(parsed1.netloc == parsed3.netloc) # False

4. Verschillen tussen urlparse() en urlsplit()

De urllib.parse module biedt ook de urlsplit() functie, die zeer vergelijkbaar is met urlparse(). Het belangrijkste verschil tussen de twee functies is hoe zij de params eigenschap verwerken.

  • urlparse(): Dit scheidt de params eigenschap apart.

  • urlsplit(): Dit omvat de params eigenschap in de path eigenschap en retourneert een SplitResult object zonder de params eigenschap.

Aangezien params in de moderne webontwikkeling vrijwel niet meer wordt gebruikt, kan in veel gevallen ook urlsplit() worden gebruikt. Toch biedt urlparse() een meer algemene en volledige scheiding.


Conclusie: Een onmisbare tool voor URL-analyse

De urlparse() functie van Python is een krachtig hulpmiddel dat het mogelijk maakt om complexe URL-strings systematisch op te splitsen en alleen de benodigde delen te extraheren. Vooral de .netloc eigenschap biedt essentiële informatie over de host en het poort nummer in de URL, waardoor het een zeer nuttig hulpmiddel is voor domein-gebaseerde logica of URL-reconstructie.

Voor alle Python-ontwikkelaars die met URLs werken, zoals bij web scraping, API-verzoeken en beveiligingsvalidatie, is urlparse() een essentiële kennis die moet worden beheerst. Gebruik deze functie om URL-gegevens effectiever te beheersen en te benutten.

urlparse diagram