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!

Tento web využívá cookies pro zajištění funkčnosti webu a získání statistik návštěvnosti webu. Více informací

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close