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

beer

  • *****
  • 729
    • Zobrazit profil
Vygrepování HTML tagu přes více řádků
« kdy: 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.
Kód: [Vybrat]
<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>
« Poslední změna: 01. 06. 2017, 17:04:35 od Petr Krčmář »


noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #1 kdy: 31. 05. 2017, 19:25:59 »
Neco jsem splacal:
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

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

gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #2 kdy: 31. 05. 2017, 19:38:44 »
Kód: [Vybrat]
cat soubor.html | grep -zPo '<div.*class="Message".*?</div>'

gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #3 kdy: 31. 05. 2017, 19:51:22 »
Neco jsem splacal:
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

$ 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í.

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #4 kdy: 31. 05. 2017, 19:53:49 »
Jit s grepem na html je jako vyrazit s korkovou zatkou na aligatory.


gll

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #5 kdy: 31. 05. 2017, 19:59:43 »
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.

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #6 kdy: 31. 05. 2017, 20:20:10 »
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.

beer

  • *****
  • 729
    • Zobrazit profil
Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #7 kdy: 31. 05. 2017, 21:29:16 »

Díky, zatím hledám a zkouším.


Citace
Kód: [Vybrat]
cat /tmp/output_login.htm | tr '\n' ' ' | sed -r 's/^.*(<div class="\w+Message\w+">.*<\>).*$/\1/'


Tohle moc nefunguje:
Kód: [Vybrat]
<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 &copy; 1994-2017 Hurricane Electric.<br />All Rights Reserved<br /></span> <> <>

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #8 kdy: 31. 05. 2017, 21:31:51 »

Kód: [Vybrat]
cat /tmp/output_login.htm | tr '\n' ' ' | sed -r 's/^.*(<div class="\w+Message\w+">.*<\>).*$/\1/'

Kód: [Vybrat]
cat foo.txt | bar
je typicky zbytecne a neni od veci vzit

Kód: [Vybrat]
bar < foo.txt

beer

  • *****
  • 729
    • Zobrazit profil
Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #9 kdy: 31. 05. 2017, 21:39:51 »

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



beer

  • *****
  • 729
    • Zobrazit profil
Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #10 kdy: 31. 05. 2017, 22:13:12 »
[/font][/size]
Kód: [Vybrat]
cat foo.txt | bar [/font][/size]je typicky zbytecne a neni od veci vzit
Kód: [Vybrat]
bar < foo.txt [/font][/size]
[/font][/size]
Proč nefunguje třeba echo < file?

Kód: [Vybrat]
echo < file
« Poslední změna: 31. 05. 2017, 22:15:23 od beer »

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #11 kdy: 31. 05. 2017, 22:26:39 »
[/font][/size]
Kód: [Vybrat]
cat foo.txt | bar [/font][/size]je typicky zbytecne a neni od veci vzit
Kód: [Vybrat]
bar < foo.txt [/font][/size]
[/font][/size]
Proč nefunguje třeba echo < file?

Kód: [Vybrat]
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).

Unknown

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #12 kdy: 01. 06. 2017, 01:46:24 »
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.
Kód: [Vybrat]
<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 Vam na OpenWrt nefunguje?

Sten

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #13 kdy: 01. 06. 2017, 02:09:54 »
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.

JS

Re:vygrepování či vysedování html tagu, který je na více řádků
« Odpověď #14 kdy: 01. 06. 2017, 06:52:04 »
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).

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.