DEV Community

Cover image for Van Browser naar Database: Het Kortste Pad voor Webtabellen
circobit
circobit

Posted on

Van Browser naar Database: Het Kortste Pad voor Webtabellen

Je hebt data gevonden op een website. Je hebt het nodig in je database.

Wat is het snelste pad van punt A naar punt B?

Deze gids behandelt de praktische workflows om HTML-tabellen in SQLite, PostgreSQL, MySQL en andere databases te krijgen — met minimale wrijving.

De Algemene Workflow

Elke browser-naar-database pipeline heeft dezelfde stappen:

  1. Extraheren — Haal de tabel uit de webpagina
  2. Opschonen — Fix opmaak, typen en structuur
  3. Laden — Voeg in in de database

De vraag is waar elke stap te doen en met welke tools.

Pad 1: CSV als Tussenstap

De meest voorkomende aanpak. Werkt met elke database.

Stap 1: Exporteren naar CSV

Gebruik een browserextensie zoals HTML Table Exporter of kopieer-plak in een spreadsheet en sla op als CSV.

Belangrijke overweging: Scheidingstekenkeuze. Komma's werken, tenzij je data komma's bevat. Puntkomma's of tabs zijn veiliger voor rommelige data.

Stap 2: Laden in Database

SQLite:

sqlite3 mydb.db
.mode csv
.import data.csv tabelnaam
Enter fullscreen mode Exit fullscreen mode

Of met headers:

sqlite3 mydb.db <<EOF
.mode csv
.headers on
.import data.csv tabelnaam
EOF
Enter fullscreen mode Exit fullscreen mode

PostgreSQL:

COPY tabelnaam FROM '/pad/naar/data.csv' 
WITH (FORMAT csv, HEADER true);
Enter fullscreen mode Exit fullscreen mode

Of met psql:

\copy tabelnaam FROM 'data.csv' WITH (FORMAT csv, HEADER true);
Enter fullscreen mode Exit fullscreen mode

MySQL:

LOAD DATA INFILE '/pad/naar/data.csv'
INTO TABLE tabelnaam
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
Enter fullscreen mode Exit fullscreen mode

Voor- en Nadelen

✅ Universele compatibiliteit

✅ Eenvoudig tussenbestand te inspecteren

✅ Handmatig problemen fixen vóór laden

❌ Extra stap

❌ Type-inferentie is basaal

Pad 2: Direct naar SQL-statements

Exporteer de tabel direct als INSERT-statements.

Exporteren als SQL

Sommige exporttools genereren direct SQL. De output ziet er zo uit:

INSERT INTO tabelnaam (kol1, kol2, kol3) VALUES
('waarde1', 'waarde2', 123),
('waarde4', 'waarde5', 456);
Enter fullscreen mode Exit fullscreen mode

Laden

Voer simpelweg het SQL-bestand uit:

# SQLite
sqlite3 mydb.db < data.sql

# PostgreSQL
psql -d mydb -f data.sql

# MySQL
mysql mydb < data.sql
Enter fullscreen mode Exit fullscreen mode

Voor- en Nadelen

✅ Eén stap van export naar database

✅ SQL is overdraagbaar tussen databases (grotendeels)

❌ Grote datasets = enorme SQL-bestanden

❌ Tabelschema moet eerst gedefinieerd worden

Pad 3: Python + Pandas Pipeline

Maximale flexibiliteit. Het beste voor herhaalde imports of complexe opschoning.

Volledige Workflow

import pandas as pd
from sqlalchemy import create_engine

# Stap 1: Laad CSV (geëxporteerd vanuit browser)
df = pd.read_csv('data.csv')

# Stap 2: Opschonen
df.columns = df.columns.str.lower().str.replace(' ', '_')  # Normaliseer kolomnamen
df['date'] = pd.to_datetime(df['date'])  # Parseer datums
df['amount'] = df['amount'].str.replace('[$,]', '', regex=True).astype(float)  # Schoon valuta op

# Stap 3: Laden naar database
engine = create_engine('sqlite:///mydb.db')
# Of: create_engine('postgresql://user:pass@localhost/mydb')
# Of: create_engine('mysql+pymysql://user:pass@localhost/mydb')

df.to_sql('tabelnaam', engine, if_exists='replace', index=False)
Enter fullscreen mode Exit fullscreen mode

Type-mapping

Pandas leidt typen af, maar je kunt expliciet zijn:

df.to_sql('tabelnaam', engine, 
          if_exists='replace', 
          index=False,
          dtype={
              'id': Integer(),
              'name': String(100),
              'created_at': DateTime(),
              'amount': Float()
          })
Enter fullscreen mode Exit fullscreen mode

Voor- en Nadelen

✅ Volledige controle over opschoning en typen

✅ Verwerkt complexe transformaties

✅ Herhaalbaar en scriptbaar

❌ Vereist Python-omgeving

❌ Overkill voor eenmalige imports

Pad 4: DuckDB (De Moderne Snelkoppeling)

DuckDB leest CSV direct en verwerkt de meeste opschoning automatisch.

Directe Query

-- Query CSV zonder importeren
SELECT * FROM 'data.csv';

-- Met type-inferentie
SELECT * FROM read_csv_auto('data.csv');

-- Maak tabel van CSV
CREATE TABLE mytable AS SELECT * FROM 'data.csv';
Enter fullscreen mode Exit fullscreen mode

Van Browser naar Query in Seconden

# Exporteer tabel als CSV vanuit browser
# Query dan direct:
duckdb -c "SELECT kolom1, SUM(kolom2) FROM 'data.csv' GROUP BY kolom1;"
Enter fullscreen mode Exit fullscreen mode

Geen schemadefinitie. Geen importstap. Gewoon queryen.

Voor- en Nadelen

✅ Snelste voor ad-hoc analyse

✅ Uitstekende type-inferentie

✅ SQL-interface

❌ Geen traditionele database (voor persistentie, exporteer resultaten)

Veelvoorkomende Problemen Afhandelen

Kolomnamen met Spaties

Webtabellen hebben vaak headers als "Totale Omzet" of "Year to Date".

Fixen bij export: Sommige tools normaliseren headers automatisch.

Fixen bij import:

df.columns = df.columns.str.replace(' ', '_').str.lower()
Enter fullscreen mode Exit fullscreen mode

Of in SQL na import:

ALTER TABLE mytable RENAME COLUMN "Totale Omzet" TO totale_omzet;
Enter fullscreen mode Exit fullscreen mode

Gemengde Getalnotaties

Europees (1.234,56) vs Amerikaans (1,234.56) formaat breekt imports.

Fixen vóór import: Gebruik een tool met schoonmaakpresets, of:

# Europees naar standaard
df['value'] = df['value'].str.replace('.', '').str.replace(',', '.').astype(float)
Enter fullscreen mode Exit fullscreen mode

Null-representaties

Webtabellen tonen blanko's, "N/A", "—", "-" voor ontbrekende data.

df = df.replace(['N/A', '', '-', ''], pd.NA)
Enter fullscreen mode Exit fullscreen mode

Of in DuckDB:

SELECT NULLIF(kolom, 'N/A') AS kolom FROM 'data.csv';
Enter fullscreen mode Exit fullscreen mode

Datums in Diverse Formaten

df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=True)
Enter fullscreen mode Exit fullscreen mode

De format='mixed' verwerkt inconsistente datumformaten in dezelfde kolom.

Het Juiste Pad Kiezen

Scenario Aanbevolen Pad
Eenmalige import, kleine tabel CSV + directe database-import
Eenmalige import, opschoning nodig Python + Pandas
Snelle analyse, geen persistentie nodig DuckDB
Regelmatige imports van dezelfde bron Python-script (automatiseer)
SQL-formaat nodig voor delen/versiebeheer Directe SQL-export

Voorbeeld: Volledige Workflow

Stel dat je een tabel met productdata op een website hebt.

Stap 1: Exporteer met HTML Table Exporter → CSV met opgeschoonde getallen

Stap 2: Snelle validatie in DuckDB:

SELECT COUNT(*), COUNT(DISTINCT product_id) FROM 'products.csv';
-- Controleer op duplicaten
Enter fullscreen mode Exit fullscreen mode

Stap 3: Laden in PostgreSQL:

import pandas as pd
from sqlalchemy import create_engine

df = pd.read_csv('products.csv')
engine = create_engine('postgresql://user:pass@localhost/inventory')
df.to_sql('products', engine, if_exists='replace', index=False)
Enter fullscreen mode Exit fullscreen mode

Totale tijd: 2 minuten.

De Meta-les

Het kortste pad is niet altijd het meest directe.

30 seconden besteden aan opschoning bij export bespaart 10 minuten debuggen van importfouten. Het juiste tussenformaat gebruiken (CSV vs SQL vs JSON) hangt af van je doeldatabase en datacomplexiteit.

Voor de meeste webtabel → database workflows:

  1. Exporteer naar CSV met getal-/datumopschoning
  2. Laad met de native CSV-import van je database
  3. Breng Python pas in als je complexe transformaties nodig hebt

Eenvoudige pipelines zijn onderhoudbare pipelines.

Bekijk voor Python-workflows specifiek onze gedetailleerde gids over het exporteren van alle rijen uit een gepagineerde webtabel.


Wil je schone exports die database-ready zijn? Meer info op gauchogrid.com/nl/html-table-exporter of probeer HTML Table Exporter gratis in de Chrome Web Store.

Top comments (0)