HTML-filtering

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

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. Kunnen sommige HTML-tags behouden blijven?
  3. Kan specifieke HTML-opmaak daarbij vervangen door iets 'platters'? Bv. een tabel omzetten naar een bulleted list?
  4. Kunnen HTML-entiteiten zoals & amp ; daarbij omgezet worden?
  5. Kan ik dit toepassen op velden in een LibreOffice Calc-bestand of in een MySQL-database?

Opmerkingen:

Alle tags filteren

Dit is het enige cruciale item: Alle HTML-tags kunnen filteren. Ook als er parameters en weet-ik-veel-wat voor toeters en bellen bij zitten

Sommige tags behouden

Graag de volgende tags behouden:

<b></b>
<br>
<ul></ul>
<li>

Dat kan desnoods via find-en-replace, maar uiteraard zou het handig zijn als het eenvoidiger kan.

Opmaak behouden?

  • Heel handig als tabellen naar unsorted lists kunnen worden omgezet
  • Hx-headings converteren naar linebreaks
  • Etc.?

Waarschijnlijk valt hier met find-and-replace al een hoop goed te doen.

HTML-entititeiten omzetten

Graag, maar niet cruciaal, want find-&-replace.

Vanuit Calc of MySQL?

Want dat is waar de data zit. En het gaat om 1.000 of 10.000 stukken tekst.

Gezochte oplossing

  • De ideale oplossing is eentje die compleet geautomatiseerd is, zodat ik de procedure moeiteloos kan herhalen. Bv.: Een script dat dit doet op een MySQL-database. Waarschijnlijk minder handig als deze operatie wordt uitgevoerd op bestanden in een map (zoals Mogrify doet voor afbeeldingen)
  • In SQL, Bash, Python, of een online tool (online tool waarschijnlijk alleen voor testen of kleine hoeveelheid data).

Inventaris

  • Python: Python kent diverse libraries om HTML te filteren. Daarnaast zal de koppeling met MySQL ook geen probleem zijn → Dit is waarschijnlijk de beste all-round 'industriële' oplossing → Zie HTML-filtering in Python voor meer
  • PHP: PHP kent de HTML Purifier-library. Ik werk liever niet in PHP
  • Search & replace in SQL : Leuk bedacht, maar onwerkbaar → Zie verderop
  • Online tools - Zubrag.com: Zubrag.com ziet er heel goed uit, in ieder geval voor kleine hoeveelheden data → Zie elders voor details.

Zubrag

Deze online tool van Zubrag.com ziet er hoopvol uit, zolang het om een beperkte hoeveelheid data gaat.

Positief

  • 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 de ankertekst - 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)

Find-&-replace in SQL - Geen oplossing

SQL lijkt prima geschikt te zijn voor find-&-replace.

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

In de praktijk werkt dit echter totaal niet: Ik heb in het voorjaar van 2018 hier ca. een middagje op gezeten, en er bleken steeds opnieuw situaties te zijn die ingewikkelder maken. Bv.:

  • Het wordt lastig als je meerdere hyperlinks in een object hebt, maar niet onmogelijk: Waarschijnlijk kun je die dynamisch uitfilteren met bv. substring_index.
  • De syntaxis van HTML is zó divers, dat het heel veel werk wordt, om dat middels find-&-replace te fixen. Zelfs met regular expressions (wat MySQL in dit geval niet kent)
  • Wat te doen met tabellen?

→ Dit werkt niet!

Python

HTML-filtering in Python.

Zie ook

Bronnen