Dev.to WebDev πŸ›  Dev πŸ‘ 0 πŸ“– 4 min read

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

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

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:

  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.

πŸ“° Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.