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:
- Extraheren — Haal de tabel uit de webpagina
- Opschonen — Fix opmaak, typen en structuur
- 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
Of met headers:
sqlite3 mydb.db <<EOF
.mode csv
.headers on
.import data.csv tabelnaam
EOF
PostgreSQL:
COPY tabelnaam FROM '/pad/naar/data.csv'
WITH (FORMAT csv, HEADER true);
Of met psql:
\copy tabelnaam FROM 'data.csv' WITH (FORMAT csv, HEADER true);
MySQL:
LOAD DATA INFILE '/pad/naar/data.csv'
INTO TABLE tabelnaam
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
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);
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
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)
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()
})
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';
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;"
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()
Of in SQL na import:
ALTER TABLE mytable RENAME COLUMN "Totale Omzet" TO totale_omzet;
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)
Null-representaties
Webtabellen tonen blanko's, "N/A", "—", "-" voor ontbrekende data.
df = df.replace(['N/A', '—', '-', ''], pd.NA)
Of in DuckDB:
SELECT NULLIF(kolom, 'N/A') AS kolom FROM 'data.csv';
Datums in Diverse Formaten
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=True)
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
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)
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:
- Exporteer naar CSV met getal-/datumopschoning
- Laad met de native CSV-import van je database
- 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)