<div dir="ltr"><div><div>Zrovna BeautifulSoup, aspoň ten starý (tzn. ne bs4) má implementaci založenou na regulárních výrazech, AFAIK. Teď si lze dokonce vybrat backend.<br><br></div>Já taky přešel na lxml, má API stejné/podobné jako ElementTree a v mnoha benchmarcích vyšlo jako nejrychlejší knihovna na XML/HTML pro Python (je ovšem Cčková, takže na PyPy to nepojede). Jeho HTML parser se taky vyrovná s lecčím, byť v diskusích jsou hlasy, které kritizují tu způsob lxml jak se vypořádává s nevalidním markupem, tu způsob BS, takže výstupy jsou odlišné, ale který je lepší, to je asi záležitost osobní preference. Já nikdy neměl tak tragické HTML na parsování, abych to poznal.<br>

<br>Jinak souhlas s Petrem. Taky mám vybudovaný reflex, kdy vidím regexpy a HTML vedle sebe jako rudý praporek a okamžitě jdu hledat tu odpověď ze StackOverflow :-)<br><br></div>H<br></div><div class="gmail_extra"><br><br>

<div class="gmail_quote">2013/1/13 rajcze <span dir="ltr"><<a href="mailto:rajcze@gmail.com" target="_blank">rajcze@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Jojo, ja s tim samozrejme souhlasim, a diky zes to rozepsal do detailu (ja uz na to v noci po navratu z piva nemel moral :) <br>I proto jsem se ptal, co konkretne chce Bystroushaak delat, jak moc si muze zarucit, ze vi jak bude vypadat vstup, atp. Tedy jestli ma vubec smysl se zabyvat cimkoli jinym bez DOM parserem + xpath (pravda, ze z didaktickeho hlediska by bylo lepsi to neresit, a presvedcit ho ze je blbost to regexpem resit.<br>


<br>Na lxml se kouknu, diky za tip.<br><br>Joza<br><br><div class="gmail_quote">2013/1/13 Petr Messner <span dir="ltr"><<a href="mailto:petr.messner@gmail.com" target="_blank">petr.messner@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
<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"><div>
<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>




<div><br></div></div></blockquote><div><br></div></div><div>Jenže nestačí triviální úloha, ale je nutné i trivální HTML. A ani validní HTML neznamená triviální...</div><div><div><br>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>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>


<span><font color="#888888">

<div><br></div><div>PM</div></font></span></div><div><br></div><div><br></div></div></div></div>
<br></div></div><div class="im">_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@py.cz" target="_blank">Python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br></div></blockquote></div><div class="HOEnZb"><div class="h5"><br><br clear="all"><br>-- <br>Rules of Optimization:<br>

Rule 1: Don't do it.<br>Rule 2 (for experts only): Don't do it yet.
</div></div><br>_______________________________________________<br>
Python mailing list<br>
<a href="mailto:Python@py.cz">Python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br></blockquote></div><br></div>