[python] Pomoc s pythonním RE

Honza Javorek jan.javorek na gmail.com
Neděle Leden 13 13:01:06 CET 2013


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.

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.

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 :-)

H


2013/1/13 rajcze <rajcze na gmail.com>

> 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 :)
> 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.
>
> Na lxml se kouknu, diky za tip.
>
> Joza
>
> 2013/1/13 Petr Messner <petr.messner na gmail.com>
>
>> 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
>>
>>
>>
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>
>
>
> --
> Rules of Optimization:
> Rule 1: Don't do it.
> Rule 2 (for experts only): Don't do it yet.
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20130113/b5c85a51/attachment.html>


Další informace o konferenci Python