<div dir="ltr">Dne 12. ledna 2013 23:51 rajcze <span dir="ltr"><<a href="mailto:rajcze@gmail.com" target="_blank">rajcze@gmail.com</a>></span> napsal(a):<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
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<div class="">
<div class="h5"><br></div></div></blockquote><div><br></div><div style>Jenže nestačí triviální úloha, ale je nutné i trivální HTML. A ani validní HTML neznamená triviální...</div><div><div style><br class="">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ů:</div>
<div><br></div><div>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.</div>
<div><br></div><div>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.</div>
<div><br></div><div>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?</div>
<div><br></div><div>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.</div>
<div><br></div><div><br></div><div><div>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í. <br>
</div></div><div><br></div><div style>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).</div>
<div><br></div><div>PM</div></div><div><br></div><div><br></div></div></div></div>