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)
- to naštěstí lze protože URL je vždy ve formátu
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:
- jako s JSONem – dokud nestáhneme HTML (info o doplňcích)
- 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 uzelitems
)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 mezeraforEach(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 taguog:title
(vrací pole, proto čtu první prvkek[0]
) a z něj HTML atributcontent
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 funkcifind()
a hledat řetězec pomocí regulárního výrazua 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 umatch()
se musí shodovat s celým řetězcem (proto zde použitý regulární výraz začíná a končí.*
)
- zde pozor: u funkce
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.
Nenech si to pro sebe...
Pokud tě článek zaujal, sdílej ho s ostatními. Díky!