HTML-filtering

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Soms krijg ik data aangeleverd in HTML-formaat, terwijl de beoogde toegang alleen platte tekst toestaat, of slechts een beperkte subset van HTML. Een voorbeeld is een export vanuit een webwinkel, bedoeld voor upload naar Amazon.

Het probleem

  1. Hoe kan ik alle HTML-tags (inclusief parameters e.d.) uit een bestand oid. filteren?
  2. Kan specifieke HTML-opmaak daarbij vervangen door iets 'platters', zodat bv. een tabel enigszins in stand blijft?
  3. Kunnen HTML-entiteiten zoals & amp ; daarbij omgezet worden?

Gezochte oplossing

  • De ideale oplossing is eentje die compleet geautomatiseerd is, zodat ik de procedure moeiteloos kan herhalen. Bv.: Een script dat alle teksten in een bestand of in een map aanpast (zoals Mogrify doet voor afbeeldingen). Liefst inclusief headers, waar nodig
  • In SQL, Bash, Python, of een online tool (online tool waarschijnlijk alleen voor testen of kleine hoeveelheid data).

Inventaris

  • Python HTMLParser-library [1]
  • PHP HTML Purifier-library [2]
  • SQL: Het lijkt aantrekkelijk om dit in SQL te doen [3], maar HTML is daar vermoedelijk te veelzijdig voor [4]
  • Online tools: Zubrag.com

Zubrag

Deze online tool van Zubrag.com ziet er hoopvol uit:

Goed

  • Je kunt specificeren welke tags niet gestripped hoeven te worden. Da's heel handig, omdat een aantal tags wel door Amazon worden ondersteund. Als je vanuit het resultaatscherm teruggaat naar het inputscherm, blijft het lijstje met te-behouden-tags behouden. Da's extra handig
  • Hyperlinks worden vervangen door gewoon de tekst - Perfect
  • HTML-codes worden vervangen door UTF8-codes - Perfect, maar verwijst wel een meta charset="UTF-8" in de header van het bestand, omdat het anders blijkbaar als Latin1 wordt geïnterpreteerd.

Pre-processing

Pre-processing lijkt noodzakelijk te zijn. Een snelle test:

Headers omfietsen naar line breaks

Bv.:

</h1> → <br>
</h2> → <br>


Tabel omfietsen naar bulleted list

<table   → <ul<table
</table> → </table><br>
<tr>     → <li>
(nog ergens spaties invoegen, anders worden cellen samengevoegd)

SQL

In SQL lijk je een heel eind te kunnen komen. Denk bv. aan:

  • regex → Nee: Dat werkt niet voor find-&-replace
  • substring_index, left(), right()
  • instr

Hyperlinks?

Het wordt ingewikkelder als je meerdere hyperlinks in een veld hebt, maar niet onmogelijk: Waarschijnlijk kun je die dynamisch uitfilteren met bv. substring_index.

...Of toch maar niet

In de praktijk valt dit tegen: Ik heb in het voorjaar van 2018 hier ca. een middagje op gezeten, en er bleken steeds opnieuw situaties te zijn waar ik geen rekening mee had gehouden. Bv. wat te doen met complete tabellen?

Bronnen