In dit voorbeeld leer je hoe je PDF-bestanden van een website kunt ophalen en opslaan als veldwaardes in een Knack-tabel.
Het RIVM publiceert wekelijks een update van de epidemiologische situatie omtrent COVID-19 in PDF-formaat. Alhoewel het een automatisch gegenereerd TeX-bestand lijkt, is het lastig om hier gestructureerde informatie uit te halen. Andere databronnen van RIVM lenen zich hier beter voor.
Doel van het script is om dagelijks de meest recent gepubliceerde update te laden in het Knack bestandsveld Rapport_epidemiologische_situatie
van een tabel met dagstanden. Dit veld wordt afgebeeld in Invantive SQL op meerdere velden zoals de bestandsnaam Rapport_epidemiologische_situatie_filename
en de binaire inhoud Rapport_epidemiologische_situatie_data
.
Een handige manier om deze PDF-bestanden te laden is om eerst het meest recente PDF-bestand te bepalen en daarna dit weg te schrijven in de juiste dagstand met een update
.
De bepaling van het meeste recente PDF-bestand gebeurt door alle direct onderliggende kindpagina’s van de RIVM URL op te halen via internettable
en die te beperken tot PDF-documenten. De URL metadata over laatst gewijzigd is hierbij niet bruikbaar; vaak wordt het verslag van voorgaande week/weken later nog bijgewerkt of in ieder geval de metadata gewijzigd. Het beperken tot PDF-documenten gebeurt in de select
van de cursor r
door twee filters:
- URL heeft juiste formaat, eindigend op onder andere
pdf
. - het MIME-type representeert het door RIVM gebruikte MIME-type voor PDF:
application/pdf
.
Uit de URL wordt de datum van publicatie afgeleid met een reguliere expressie: de datum in formaat JJJJMMDD wordt losgeweekt als los tekstveld datum_gepubliceerd_c
. Merk op dat binnen Invantive SQL een terugverwijzing naar een reguliere expressie match gaat met het dollarteken als in $1
. De syntax met \1
wordt niet gebruikt. Deze tekst wordt vervolgens omgezet naar een datum met een to_date
.
De meest recente PDF wordt bepaald door afgelopend te sorteren op de datum en alleen de eerste op te halen (de meest recente). Met een update
statement wordt de bestandsinhoud en de bestandsnaam zonder URL-pad vastgelegd in de tabel Dagelijkse_updateExpanded
.
begin
for r
in
( select url
, basename(url) file_name
, CONTENTS_BLOB
, datum_gepubliceerd_c
, to_date(datum_gepubliceerd_c, 'YYYYMMDD') datum_gepubliceerd
from ( select url
, CONTENTS_BLOB
, regexp_replace
( url
, '.*/COVID-19_WebSite_rapport_wekelijks_(202[0-9][0-9][0-9][0-9][0-9])_.*pdf', '$1'
)
datum_gepubliceerd_c
from internettable
( 'https://www.rivm.nl/coronavirus-covid-19'
|| '/actueel'
|| '/wekelijkse-update-epidemiologische-situatie-covid-19-in-nederland'
stay on site
maximum depth 2
)
where URL like '%/COVID-19_WebSite_rapport_wekelijks_%.pdf'
and MIME_TYPE = 'application/pdf'
and RETRIEVAL_SUCCESSFUL = true
)
order
by datum_gepubliceerd desc
limit 1
)
loop
update Dagelijkse_updateExpanded
set Rapport_epidemiologische_situatie_filename = r.file_name
, Rapport_epidemiologische_situatie_data = r.contents_blob
where Datum = r.datum_gepubliceerd
;
end loop;
end;