Co je OpenRefine?

OpenRefine (dříve Google Refine) je nástroj pro efektivní hromadné zpracování a transformaci textu. Je zdarma a nainstalujete si ho na svůj počítač a data tak zůstávají u vás. V on-line marketingu se často používá pro analýzu klíčových slov, mj. díky schopnosti najít a seskupit podobné textové řetězce.

Funkce OpenRefine

Krom toho umí také (mimo jiné):

  • stáhnout obsah webových stránek dle zadaných URL (například ze sitemap.xml)
  • rozdělovač či slučovat hodnoty do sloupců
  • parsovat HTML/XML a JSON formát
  • parsovat (extrahovat) text pomocí regulárního výrazu
  • hromadné operace nad polem hodnot
  • konverze textu na číslo

Většinu uvedených funkcí realizujete pomocí jazyka GREL (General Refine Expression Language).

Právě tyhle funkce jsem použil ve svém řešení.

Výhodou OpenRefine je, že transformaci skládající se z několika desítek kroků můžete uložit a opakovaně používat na podobná vstupní data.

Můj případ: Extrakce dat ze sady URL

Můj případ je trochu specifický, ale stejný princip dokážete využít pro mnoho podobných situací.

Používám vyšší desítky Chrome doplňků a proto používám doplněk pro jejich správu SimpleExtManager. Umožňuje seskupit doplňky do skupin a jednotlivě či po skupinách je zapínat/vypínat. Mým cílem bylo vytvořit seznam mých doplňků vč. názvu, odkazu a dalších informací (uvedených na stránkách doplňků).

SimpleExtManager dokáže seznam doplňků exportovat, ale export obsahuje jen název skupiny a ID doplňku. Krom toho je exportovaný soubor hybrid mezi XML a JSON formátem.

Mým cílem tedy bylo:

  • získat z exportu IDčka doplňků (ale zachovat vazbu na skupinu, do které jsem si doplněk zařadil)

  • z IDček složit URL doplňku

    • to naštěstí lze protože URL je vždy ve formátu https://chrome.google.com/webstore/detail/XXX, kde XXX je ID doplňku (ačkoliv se URL přesměruje potom na jinou URL – obsahující i název)
    • navíc doplněním na konec URL ?hl=en zajistíte, že vždy dostanete stránku v anglické verzi (pokud existuje ve více jazycích)
  • stáhnout HTML stránky s informacemi o doplňku

  • z HTML kódu stránky extrahovat název a další informace o doplňku

  • exportovat takto získaná data jako CSV či XLSX

Transformace v OpenRefine

V textovém popisu nepůjdu úplně krok za krokem celý postup. Některé kroky, pro extrakci textu z HTML se opakují. Klíčové kroky vám ukážu, krok za krokem ve videu.

Celou sadu kroků si můžete stáhnout, importovat a aplikovat na svůj export (resp. Backup) z SimpleExtManageru.

Prvním krokem je načtení dat do OpenRefine. Vzhledem k tomu, že exportovaný soubor je XML (v němž jsou pak JSONy), zvolíme XML a vybereme uzel <val>.

Dále pak s daty budeme pracovat:

  1. jako s JSONem – dokud nestáhneme HTML (info o doplňcích)
  2. jako s HTML – pro parsování dat ze stránky

U většiny transformací postupujeme tak, že na základě dat z jednoho sloupce vytvoříme další sloupec. Použijeme tedy volbu Edit column > Add column based on this column a zapíšeme GREL výraz (kde value je hodnotou z aktuálního sloupce).

Převod JSONu na řádky a hromadné získání HTML z URL adres (scraping)

Kroky od načtení vstupních dat až po získání tabulky se všemi informacemi o jednotlivých Chrome doplňcích v  Excelu (či CSV) ukazuji ve videu.

Použité GREL funkce

  • value.parseJson() – transformace vstupu na JSON (získávám uzel items)

  • forEach() (viz dokumentaci) – procházení polem (takto z JSONu získám IDčka a zřetězím je do stringu, kde oddělovačem je čárka a mezera forEach(value.parseJson().items,v,v).join(", "))

  • value.parseHtml().select("meta[property=og:title]")[0].htmlAttr("content") – získaný kód webové stránky transformuji na HTML, najdu uzly meta tagu og:title (vrací pole, proto čtu první prvkek [0]) a z něj HTML atribut content

  • value.find(/<a class="C-b-p-D-u-y h-C-b-p-D-xd-y" href="([^"]+)" target="_blank" rel="nofollow">/)[0].match(/.*href="([^"]+)".*/)[0] – pokud si pro nalezení hodnoty v HTML kódu nevystačíte s CSS selectorem, můžete použít funkci find() a hledat řetězec pomocí regulárního výrazu

  • a následně z něj pomocí funkce match() zachytit jen část – v našem případě hodnotu atributu href pomocí části ([^"]+)

    • zde pozor: u funkce find() stačí, že regulárnímu výrazu odpovídá část vstupní hodnoty, ale u match() se musí shodovat s celým řetězcem (proto zde použitý regulární výraz začíná a končí .*)

Pokud si chcete vše vyzkoušet přímo na mém příkladu, můžete si stáhnout JSON s konfigurací transformace.

Vytvoření seznamu doplňků do článku – aneb převod CSV na HTML

Mým finálním cílem bylo vytvoření seznamu Chrome doplňků do článku. Proto jsem z OpenRefinu exportoval data jako CSV a převedl je pomocí regulárního výrazu na HTML v požadovaném tvaru.

Související

Nenech si to pro sebe...

Pokud tě článek zaujal, sdílej ho s ostatními. Díky!