Vygrepování HTML tagu přes více řádků

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #15 kdy: 01. 06. 2017, 06:56:51 »
Jn, mate pravdu s tim sedem. Pokud muzete pouzit Perl, tak neco takoveho vypada, ze funguje:
Kód: [Vybrat]
$ cat in.html
<div class="xxx">yyy</div>
before
<div class="errorMessageBox">Zde je nějaká odpověd
serveru na více řádcích, class má vždy Message, ale může se lišit co je před ním a za ním.
<p>Někdy je odpověď strukturovaná i do několika odstavců, rád bych, aby to vypsalo celý obsah toho tagu, včetně začátečního Xdiv class="*Message*"X i koncového X/divX
</p>
</div>
after
<div>sec div</div>

$ ( tr '\n' ' ' | perl -p -e 's/^.*(<div class="\w+Message\w+">.*?<\/div>).*$/\1/;' ) < in.html
<div class="errorMessageBox">Zde je nějaká odpověd serveru na více řádcích, class má vždy Message, ale může se lišit co je před ním a za ním. <p>Někdy je odpověď strukturovaná i do několika odstavců, rád bych, aby to vypsalo celý obsah toho tagu, včetně začátečního Xdiv class="*Message*"X i koncového X/divX </p> </div>%     

Ale jak pisou ostatni, je to nespolehlive - rozbijete se to snadno (div v divu, resp. ukonceni divu v msg divu). Lepsi by bylo to necim opravdu naparsovat a plhotucne zpracovat (Python, Ruby, JS, atp. urcite maji hezke knihovny).


gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #16 kdy: 01. 06. 2017, 07:11:28 »
Jinak na slozitejsi veci (v zasade kde to nemuzu okopirovat z nejake grep ci sed kucharky a musel bych pochopit, jak se sed programuje) pouzivam Python, a pro nej existuje docela pekna knihovna BeautifulSoup, ktera naparsuje HTML dokument do stromu a pak se na nej da dotazovat (treba najit vsechny elementy co splnuji nejakou podminku). Takze to bych asi nasadil pak tady.

nebo pyquery

gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #17 kdy: 01. 06. 2017, 07:15:14 »

To druhé
Bez výstupu na ubuntu, na openwrt chybový výstup:





Kód: [Vybrat]


grep -zPo '<div.*class="Message".*?<>' < /tmp/.testy/output_login.htm

grep: invalid option -- z
BusyBox v1.25.1 (2017-02-10 14:18:36 CET) multi-call binary.


Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...


Search for PATTERN in FILEs (or stdin)


-H Add 'filename:' prefix
-h Do not add 'filename:' prefix
-n Add 'line_no:' prefix
-l Show only names of files that match
-L Show only names of files that don't match
-c Show only count of matching lines
-o Show only the matching part of line
-q Quiet. Return 0 if PATTERN is found, 1 otherwise
-v Select non-matching lines
-s Suppress open and read errors
-r Recurse
-i Ignore case
-w Match whole words only
-x Match whole lines only
-F PATTERN is a literal (not regexp)
-E PATTERN is an extended regexp
-m N Match up to N times per file
-A N Print N lines of trailing context
-B N Print N lines of leading context
-C N Same as '-A N -B N'
-e PTRN Pattern to match
-f FILE Read pattern from file



Kód: [Vybrat]
grep -zPo '<div.*class="errorMessageBox".*?</div>' < /tmp/.testy/output_login.htm

Jindra

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #18 kdy: 01. 06. 2017, 08:03:37 »
snad druha nejcastejsi (hned po "jak opustit vim") otazka na SO je  "jak regexpem na html" :-)

https://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not

Citace
"Regular expressions can only match regular languages but HTML is a context-free language. The only thing you can do with regexps on HTML is heuristics but that will not work on every condition. It should be possible to present a HTML file that will be matched wrongly by any regular expression."

Sten

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #19 kdy: 02. 06. 2017, 14:25:11 »
It should be possible to present a HTML file that will be matched wrongly by any regular expression.

Tohle není pravda, třeba regulární výraz ^.*$ matchne jakýkoliv HTML dokument, stejně tak case-insensitive <title\b[^>]*>([^<]+)</title\b matchne do první skupiny titulek jakéhokoliv validního HTML, protože tam musí být právě jednou, nesmí být prázdný a musí být uzavřený.

Problém matchování HTML regulárními výrazy je v tom, že regulární výraz je konečný stavový automat, zatímco pro parsování HTML potřebujete zásobníkový automat, takže regulárními výrazy dokážete matchnout jen podmnožinu toho, co můžete v HTML chtít matchovat, třeba nemůžete (spolehlivě) matchnout tagy, které mohou být rekurzivní. Což je zrovna tenhle problém (<div> může být rekurzivní).


gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #20 kdy: 02. 06. 2017, 15:18:13 »
snad druha nejcastejsi (hned po "jak opustit vim") otazka na SO je  "jak regexpem na html" :-)

https://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not

Citace
"Regular expressions can only match regular languages but HTML is a context-free language. The only thing you can do with regexps on HTML is heuristics but that will not work on every condition. It should be possible to present a HTML file that will be matched wrongly by any regular expression."

To je akademické chytračení. Praktické implementace regulárních výrazů jsou něco jiného než regulární výrazy v teorii jazyků. Rekurzivní matchování v praxi není problém.

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #21 kdy: 02. 06. 2017, 15:26:38 »
To je akademické chytračení. Praktické implementace regulárních výrazů jsou něco jiného než regulární výrazy v teorii jazyků. Rekurzivní matchování v praxi není problém.

Tuhle cast, kdy regularni vyrazy nejsou regularni vyrazy mam vzdycky strasne rad...

gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #22 kdy: 02. 06. 2017, 19:43:18 »
To je akademické chytračení. Praktické implementace regulárních výrazů jsou něco jiného než regulární výrazy v teorii jazyků. Rekurzivní matchování v praxi není problém.

Tuhle cast, kdy regularni vyrazy nejsou regularni vyrazy mam vzdycky strasne rad...

Já taky. Spousta lidí tyhle pokročilejší featury nezná a potom chybně odpovídá na stack overflow.

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #23 kdy: 03. 06. 2017, 19:40:36 »
To je akademické chytračení. Praktické implementace regulárních výrazů jsou něco jiného než regulární výrazy v teorii jazyků. Rekurzivní matchování v praxi není problém.

Tuhle cast, kdy regularni vyrazy nejsou regularni vyrazy mam vzdycky strasne rad...

Já taky. Spousta lidí tyhle pokročilejší featury nezná a potom chybně odpovídá na stack overflow.

Dalsi level je, kdyz je objevis... a pak zjistis, jak se to chova v runtime.