Sådan har vi skrællet V2's faktabokse og konverteret dem til Drupal-sprog

31. august 2017 kl. 05:117
Vi fik faktaboksene ud af artiklerne, men de skal også konverteres til Drupal-sprog og puttes i et regneark.
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

I sidste uge skrev vi om, hvordan vi fik trukket faktabokse ud af Version2’s artikler.

Målet er at slippe for at skrive de samme faktabokse igen og igen.

Vi havde held til at fange boksene med en håndfuld kodelinjer. Men det var kun første del af projektet.

HTML til Markdown

Vi har udtrukket faktaboksene i HTML-format, men for at de kan bruges i vort CMS-system, som er Drupal, skal HTML-koden konverteres til Markdown - et opmærkningssprog, som kan minde om den opmærkning Wikipedia anvender, blot mere simpel. Det benyttes i mange sammenhænge, blandt andet i den editor, som Version2's CMS benytter.

Artiklen fortsætter efter annoncen

Her i værktøjskassen er vi ikke meget for at gå over åen efter vand, og mon ikke, der allerede er nogen, der har løst vort problem med at konvertere HTML til Markdown med Java?

En søgning på nettet peger på HTML2Markdown. Det bygger tilfældigvis på Jsoup, som vi allerede har med i vores lille projekt.

Jeg downloader projektet fra Github, og det består bare af en enkelt klasse i selskab med nogle hjælpeklasser.

På projektets side på Github er der angivet et eksempel på anvendelsen:

Artiklen fortsætter efter annoncen

String markdownText = HTML2Md.convert(html, baseURL);

hvor første parameter er den HTML, der skal konverteres, og anden parameter er basis-url’en, som benyttes til at fikse partielle url’er i HTML-klumpen.

Vi tester med denne her klump HTML:

  1. <aside class="plugin right box">
  2. <h3>Optag og kønsfordeling på ITU 2017</h3>
  3. <p><strong>Digitale medier og design</strong><br> 71 optagne: heraf 38 kvinder (54%)</p>
  4. <p><strong>Softwareudvikling</strong><br> 160 optagne: heraf 35 kvinder (22%)</p>
  5. <p><strong>Global Business Informatics</strong><br> 77 optagne: heraf 24 kvinder (31%)</p>
  6. <p><strong>Data Science</strong><br> 70 optagne: heraf 17 kvinder (24%)</p>
  7. </aside>

Og det giver dette resultat som markdown:

  1. \#\#\# Optag og kønsfordeling på ITU 2017
  2.  
  3. \*\*Digitale medier og design\*\*
  4. 71 optagne: heraf 38 kvinder (54%)
  5.  
  6. \*\*Softwareudvikling\*\*
  7. 160 optagne: heraf 35 kvinder (22%)
  8.  
  9. \*\*Global Business Informatics\*\*
  10. 77 optagne: heraf 24 kvinder (31%)
  11.  
  12. \*\*Data Science\*\*
  13. 70 optagne: heraf 17 kvinder (24%)

Det ser sådan ud, hvis jeg plastrer det ind i Version2’s CMS-system:

Og det ser jo fint ud.

Komma komma streg

Sidste skridt er at gemme faktaboksene i en komma-separeret fil, som kan indlæses i vores Google Docs-system.

Egentlig er det ikke så kompliceret at skrive en komma-fil, men der er alligevel noget med at escape kommaer, linjeskift og citationstegn. Dertil kommer, at forskellige regnearksprogrammer vistnok fortolker komma-filerne på forskellig måde - det har jeg i hvert fald læst et sted. Det nemmeste er at benytte et bibliotek, og det er også mere fleksibelt, hvis det skulle komme på tale at skifte format i fremtiden.

Det er ikke svært at finde et bibliotek til den slags. For eksempel har Apache-projektet bunker af kode til at løse hverdagens små problemer med, og deres bud i denne genre hedder CSVPrinter, og kan lige det, som vi har brug - escape tegn og gemme i forskellige dialekter af komma-formatet.

Artiklen fortsætter efter annoncen

Til vores brug kan det se sådan ud:

  1. FileWriter fileWriter = new FileWriter("C:\\\\Users\\\\tan\\\\Desktop\\\\faktabokse.csv");
  2. CSVPrinter csvPrinter = new CSVPrinter(fileWriter, CSVFormat.DEFAULT);

CSVPrinter-constructoren tager en Appendable som første argument, og det er en bestemt slags uddata-strøm. I vores tilfælde udstyrer vi den med en FileWriter, som skriver strømmen til en fil på mit skrivebord. Det andet argument til constructeren angiver formatet, og her vælger vi det, som biblioteket foreslår og satser på, at det virker - og hvis det ikke gør, så er der andre muligheder at prøve med.

Nu ser vores kode fra sidste gang sådan her ud:

  1. Document fragment = Jsoup.parseBodyFragment(faktaboks.html());
  2. Elements h3 = fragment.getElementsByTag("h3");
  3. String header = "";
  4. if (!h3.isEmpty()) {
  5. header = h3.get(0).html();
  6. }
  7. String markdown = HTML2Md.convert(faktaboks.html(), "http://version2.dk");
  8. csvPrinter.printRecord(header, markdown);

I forhold til sidst, udtrækker vi også en H3-header fra HTML-koden, da konventionen på vores redaktion er, at der er sådan én som overskrift i en faktaboks. Ideen er at have overskriften stående i den ene kolonne i regnearket, og Markdown-koden i cellen ved siden af. Så er det nemt at have med at gøre.

Vi skriver til komma-filen med CsvPrinter-metoden printRecord(header, markdown). Den tager et vilkårligt antal elementer som parametre, og skriver hvert element i en celle i csv-filen. Til sidst afslutter den rækken i filen.

Og så er det bare at slippe vores lille program løs på websiderne.

Når jeg åbner min færdige csv-fil i Excel, ser det helt forkert ud:

Men det er som tidligere nævnt, fordi regnearksprogrammerne har forskellig opfattelse af formatet. Vi bruger Google Docs på redaktionen, og her går det helt fint, når der importeres:

Med få linjers kode fik vi udtrukket og konverteret HTML-koden til Markdown og puttet resultatet i en kommasepareret fil, som vi kan benytte i vores Google Docs-system. Forvent flere faktuelle faktabokse for fremtiden.

7 kommentarer.  Hop til debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
7
31. august 2017 kl. 15:47

O.K, tak.

6
31. august 2017 kl. 13:35

Hej Torben, vi beklager.

Det var en kortvarig fejl, men den kan åbenbart overvintre i cachen. Det skulle kunne løses ved at slette browserhistorik.

Mvh Tania Andersen Journalist, Version2

5
31. august 2017 kl. 13:05

Det ikke har noget med faktabokse som sådan at gøre, men her i de seneste dage har URL'en https://www.version2.dk/ stillet direkte om til Jobfinder.dk. Det samme gælder https://www.ing.dk/. Jeg kan komme ind, hvis jeg tilføjer et ? til URL'en, eller hvis jeg følger et link til en artikel. Men uden modifikationer, omstilles jeg direkte til Jobfinder.

4
31. august 2017 kl. 12:40

Du har ret :-) - vi har rettet overskriften.

Mvh Tania Andersen Journalist, Version2

3
31. august 2017 kl. 12:38

Tak for rosen. :-) XML-baserede formater er helt sikkert mere robuste, men som du også er inde på, er endestationen i vores tilfælde regnearket på vores Google Docs-system, og her var CSV det nemme bud. Alternativet kunne være at have en "snippet"-funktion i Drupal, og der findes givetvis Drupal-moduler der kan det - men det ville nok ikke gøre vores skrivearbejde meget hurtigere end ved det fælles regneark.

Mvh Tania Andersen Journalist, Version2

2
31. august 2017 kl. 11:33

Enig - dejlig føljeton.

Dog synes jeg, at Tania undervurderer Version2s indhold, når hun sammenligner det med en skraldespand.

Skralde (vb): At gennemsøge skraldespande for brugbare madvarer og ting.Skrælle (vb): At fjerne det øverste lag fra noget; at fjerne brugbare dele fra et køretøj

1
31. august 2017 kl. 09:43

Dejligt med en fortsættelse på denne handson-føljeton.

I forhold til problemet med indlæsning i Excel så gætter jeg på, at det er fordi, forfatteren valgte "Åben" i stedet for "Importér". I sidstnævnte tilfælde kan man nemlig få lov at anføre hvilke feltseperatorer, der skal anvendes og her er komma blandt andre ting sjovt nok ikke tilvalgt per default, hvilket som hovedregel skaber problemer, når man blot vælger "Åben".

I øvrigt foretrækker jeg personligt at bruge .XLSX-formatet ved programmatisk udveksling. Der findes en række standardbiblioteker, som gør det ufatteligt nemt at skrive til XLSX-filer og dette formatet er jo efterhånden understøttet overalt herunder af Google Apps.

Er det i øvrigt ikke muligt at skrive direkte til Drupals database fra Java-programmet? Eller er det fordi formålet med øvelsen har været at etablere et slags faktaboks-bibliotek, som kan indsættes manuelt i CMS'ets frontend ved skrivning af nye artikler?