Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: beer 31. 05. 2017, 19:01:25
-
Je možné ze stažené stránky vygrepovat tag, který je na více řádků? Zkoušel jsem nějaké návody, co mi našel google, ale nějak mi to nešlo. Platforma openwrt, některé programy jsou tam ořezané, ideální by byl inline příkaz.
<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 <div class="*Message*"> i koncového </div>
</p>
</div>
-
Neco jsem splacal:
$ 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
$ cat in.html | tr '\n' ' ' | sed -r 's/^.*(<div class="\w+Message\w+">.*<\/div>).*$/\1/'
<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>%
Neni to ciste (nahrazuju novy radek mezerou) a samozrejmne se to rozbije, pokud budes mit divy v divu s message (regulary na to proste nestaci), ale mozna ti to pomuze :).
-
cat soubor.html | grep -zPo '<div.*class="Message".*?</div>'
-
Neco jsem splacal:
$ 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
$ cat in.html | tr '\n' ' ' | sed -r 's/^.*(<div class="\w+Message\w+">.*<\/div>).*$/\1/'
<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>%
Neni to ciste (nahrazuju novy radek mezerou) a samozrejmne se to rozbije, pokud budes mit divy v divu s message (regulary na to proste nestaci), ale mozna ti to pomuze :).
tohle matchne poslední uzavírací tag. Musí se použít nongreedy matchování .*? . Sed nic takového AFAIK neumí.
-
Jit s grepem na html je jako vyrazit s korkovou zatkou na aligatory.
-
Jit s grepem na html je jako vyrazit s korkovou zatkou na aligatory.
Existuje vhodnější utilita, která je defaultně na každém systému? Když chcete jen nejhlouběji zanořený element, tak to jde grepem snadno.
-
Jit s grepem na html je jako vyrazit s korkovou zatkou na aligatory.
Existuje vhodnější utilita, která je defaultně na každém systému? Když chcete jen nejhlouběji zanořený element, tak to jde grepem snadno.
Takova utilita neni. Coz ale nerika nic o tom, ze ty existjici budou fungovat.
-
Díky, zatím hledám a zkouším.
cat /tmp/output_login.htm | tr '\n' ' ' | sed -r 's/^.*(<div class="\w+Message\w+">.*<\>).*$/\1/'
Tohle moc nefunguje:
<div class="infoMessageBox"> <p>Stay tuned, we will be adding more tests in the near future. In the meantime, there are some optional tests available in the sidebar on the left.</p> <p>If you have any comments or questions please don't hesitate to let us know at <a href="mailto:ipv6@he.net">ipv6@he.net</a></p> <> <> <> <> <> <div class="sidebar" id="rightbar"> <div class="block"> <div class="caption">Quick Links<> <div class="content"> <a href="https://ipv6.he.net/certification/">Certification</a><br /> <a href="https://www.tunnelbroker.net/">Tunnelbroker</a><br /> <a href="http://dns.he.net/">Free DNS</a><br /> <a href="http://bgp.he.net">BGP Toolkit</a><br> <a href="http://networktools.he.net">Net Tools App</a><br> <a href="https://www.tunnelbroker.net/forums/">Forums</a><br /> <a href="https://ipv6.he.net/certification/faq.php">FAQ</a><br /> <a href="https://ipv6.he.net/presentations.php">Video Presentations</a><br /> <a href="https://www.tunnelbroker.net/usage/">Usage Statistics</a><br /> <a href="https://www.tunnelbroker.net/status.php">Tunnel Server Status</a><br /> <a href="http://he.net/HurricaneElectricNetworkMap.pdf">Network Map</a><br /> <a href="https://lg.he.net">Looking Glass</a> (v4/v6)<br /> <a href="telnet://route-server.he.net">Route Server</a> (telnet)<br /> <a href="http://bgp.he.net/ipv6-progress-report.cgi">Global IPv6 Report</a><br /> <> <> <div class="block"> <div class="caption">Services<> <div class="content"> <a href="http://he.net/ip_transit.html">Transit</a><br /> <a href="http://he.net/colocation.html">Colocation</a><br /> <a href="http://he.net/dedicated_server.html">Dedicated Servers</a> <> <> <div class="block" id="exhaustioncounter" style="text-align: center" role="region" aria-live="off"> <div class="caption">v4 Exhaustion<> <br /> <script type="text/javascript" src="//ipv6.he.net/v4ex/sidebar.js"></script> <> <> <div id="footer"> <address id="footer_left">Hurricane Electric<br />760 Mission Court<br />Fremont, CA 94539</address> <span id="footer_right">Voice +1 (510) 580-4100<br />Fax +1 (510) 580-4151<br />Comments? <a href="mailto:info@he.net">info@he.net</a></span> <span id="footer_center">Copyright © 1994-2017 Hurricane Electric.<br />All Rights Reserved<br /></span> <> <>
-
cat /tmp/output_login.htm | tr '\n' ' ' | sed -r 's/^.*(<div class="\w+Message\w+">.*<\>).*$/\1/'
cat foo.txt | bar
je typicky zbytecne a neni od veci vzit
bar < foo.txt
-
To druhé
Bez výstupu na ubuntu, na openwrt chybový výstup:
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
-
[/font][/size]cat foo.txt | bar
[/font][/size]je typicky zbytecne a neni od veci vzitbar < foo.txt
[/font][/size]
[/font][/size]
Proč nefunguje třeba echo < file?
echo < file
-
[/font][/size]cat foo.txt | bar
[/font][/size]je typicky zbytecne a neni od veci vzitbar < foo.txt
[/font][/size]
[/font][/size]
Proč nefunguje třeba echo < file?
echo < file
Jak nefunguje? Funguje, jen si asi myslis, ze by to melo delat neco jineho, nez to ma delat ve skutecnosti ;)
Echo ze stadardniho vstupu nic necte. Pouze sve parametry vypise na jeden radek stdout (plus minus nejake drobne nastavovani v prepinacich).
-
Je možné ze stažené stránky vygrepovat tag, který je na více řádků? Zkoušel jsem nějaké návody, co mi našel google, ale nějak mi to nešlo. Platforma openwrt, některé programy jsou tam ořezané, ideální by byl inline příkaz.
<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 <div class="*Message*"> i koncového </div>
</p>
</div>
Tohle (http://www.videlibri.de/xidel.html) Vam na OpenWrt nefunguje?
-
Pokud je to HTML zároveň validní XML (ta ukázka je), doporučil bych xmllint. Pokud není, jde na OpenWRT nainstalovat Perl a modul HTML::TreeBuilder::XPath. Přeci jen HTML není regulární, aby na něj spolehlivě fungovaly regulární výrazy.
-
Jit s grepem na html je jako vyrazit s korkovou zatkou na aligatory.
Nekdy to staci.. ja to takhle obcas delam.
Co se tyce otazky - mel jsem za to, ze grep umi viceradek, ale SO doporucuje pcregrep (https://stackoverflow.com/questions/152708/how-can-i-search-for-a-multiline-pattern-in-a-file (https://stackoverflow.com/questions/152708/how-can-i-search-for-a-multiline-pattern-in-a-file)).
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.
-
Jn, mate pravdu s tim sedem. Pokud muzete pouzit Perl, tak neco takoveho vypada, ze funguje:
$ 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).
-
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
-
To druhé
Bez výstupu na ubuntu, na openwrt chybový výstup:
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
grep -zPo '<div.*class="errorMessageBox".*?</div>' < /tmp/.testy/output_login.htm
-
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
"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."
-
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í).
-
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
"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.
-
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...
-
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.
-
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.