[python] Pomoc s pythonním RE

Petr Messner petr.messner na gmail.com
Neděle Leden 13 01:23:48 CET 2013


Dne 12. ledna 2013 23:51 rajcze <rajcze na gmail.com> napsal(a):

> OT: ja sice chapu, ze na XML/HTML je potreba pouzivat zasobnikovy automat,
> ale IMHO existuje trivialni subset uloh, na ktery staci i regexpy...
> Samozrejme je potreba vedet co chci, a jaky to ma pripadne limity, ale
> nutne bych netvrdil, ze dostat subset dat z validniho XML/HTML umi jen nas
> vsemocny oblibenec :D
>
>
Jenže nestačí triviální úloha, ale je nutné i trivální HTML. A ani validní
HTML neznamená triviální...

Myslím si, že regulární výrazy by se na parsování čekoholiv z XML/HTML
neměly používat skoro nikdy. Sepsal jsem pár důvodů:

1. </script> nemusí znamenat konec Javascriptu. Může to být obsah řetězce v
Javascriptu, kdy je celý kód uzavřen v <![CDATA[ ... ]]> a proto HTML tagy
v něm nemusí být dále ošetřeny. Vzhledem k tomu, že občas je v Javascriptu
třeba dynamicky načíst další Javascriptové soubory přidáním nových <script>
elementů HTML, není nemožné, aby se toto objevilo i v normální stránce.

2. V HTML kódu je pár věcí, které jsou před předáním Javascriptovému enginu
odstraněny/zpracovány, např. již zmíněné CDATA nebo HTML entity. Použitím
HTML parseru se tohoto jednoduše zbavíte - zpracuje to za vás.

3. Podle mé zkušenosti to u jednoduchých úloh nekončí, člověk pak bude
chtít vyparsovat z HTML i něco trochu složitějšího, a pokud se stále bude
snažit použít regulární výrazy, nedopadne to dobře. Proč tedy nezačít
používat HTML parser rovnou?

4. Regulární výraz (popř. soustava regulárních výrazů), obzvláště po
zavedení korekcí velkých písmen, nadbytečných mezer a výše uvedených věcí,
přestává být čitelný, kdežto operace nad DOMem získaným z HTML parseru jsou
celkem snadno čitelné. V mém předchozím e-mailu jsem uvedl příklad s XPath,
to je podle mě vhodná obdoba regulárních výrazů pro XML/HTML - můžete si
tam vybírat elementy podle zanoření, podle atributů, podle CSS tříd, můžete
tam psát i trochu složitější výrazy (je to jazyk sám o sobě)... Ten XPath
výraz se pak automaticky zkompiluje podobně, jako se kompilují regulární
výrazy.


Na druhou stranu, abych byl spravedlivý :) Velkou výhodou regulárních
výrazů je, že samy o sobě jsou jednoduché a existuje jen jedna syntaxe a
jedna rozšířená implementace. Pro zpracování XML a HTML těch nástrojů
existuje více, liší se svou rychlostí, benevolencí k chybám v HTML,
kvalitou dokumentace, tím, zda jsou ve standardní knihovně Pythonu a od
jaké verze... Navíc lze tyto nástroje kombinovat - třeba použít parser
BeautifulSoup nebo html5lib s výstupem do ElementTree a tím zkombinovat
robustnost parseru s rychlostí.

BeautifulSoup mohu také doporučit, několikrát jsem ho použil. Před časem
jsem přešel na lxml, které toho umí hodně a je rychlé - důvodem k přechodu
bylo to, že se budoucnost BeautifulSoup zdála nejistá, ale teď vypadá OK
(nová verze, podpora Pythonu 3).

PM
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20130113/a6ca3615/attachment.html>


Další informace o konferenci Python