Portál AbcLinuxu, 5. května 2025 03:04
Ahojte, viete mi poradit ako by sa dal vyparsovat vsetok text zo zdrojoveho kodu html stranky, povedzme ze chcem vsetko text medzi tag-mi <pre> a konciacim jeho tagom </pre>
pricom tieto tagy sa niekolko krat opakuju a chcem vsetko text medzi nimi, vsetko ostatne nejako potrebujem dostat prec.
$ cat index.html |sed -n 's/<pre>\(.*\)<\/pre>/\1/p'
super! :) Len problem je v tom, ze mi to nezoberie do ohladu ked mam v zdrojovom kode blok s danym tagom, cize ak mi to nematchne na jedno riadku, tak to nevypise, neviem ako to osetrit? napr.
<pre>aaaaa bbbbbbbbbbbb cccccccccccc dddddddddddd ############ </pre>
Proste tagy byvaju rozne zalomene. Diky za echo :)
sed
vhodný nástroj, i když by k tomu asi nějak znásilnit šel.
Jedno z možných řešení je modul lxml pro Python, HTML soubor pošli na vstup následujícímu skriptu:
#! /usr/bin/env python # -*- coding: utf-8 -*- import sys from lxml import etree parser = etree.HTMLParser() tree = etree.parse(sys.stdin, parser) expr = "//*[local-name() = $name]" pre_elts = tree.xpath(expr, name="pre") for pre_elt in pre_elts: print pre_elt.text
Pokud používáš distribuci založenou na Debianu musíš mít nainstalovaný balíček python-lxml
.
my $text = join "", <STDIN>; my @vnitrky = $text =~ /<pre>(.*?)<\/pre>/sg; foreach (@vnitrky) { print $_; }
sed 's_</pre>_&\n_' SUBOR | sed -nr -e \ '/<pre>/{:a;s_</pre>_&_;tb;N;ba;:b;s_.*<pre>(.*)</pre>_\1_;p}'Najprv rozdelime, aby v kazdom riadku bol najviac jeden tag
pre
. A potom nacitame az po koncovy tag a zobrazime iba obsah ...
sed 's_</pre>_&\n_' SUBOR | sed -nr -e '/<pre>/,/<\/pre>/ { /.*<pre>/s___ /<\/pre>/s___ p }'
sed 's_</pre>_&\n_' SUBOR | sed -nr -e '/<pre>/,/<\/pre>/{ /.*<pre>/s___ /<\/pre>/s___ p }'
sed -n '/<pre>/,/<\/pre>/{s:.*<pre>::;s:</pre>.*::;p}'ale předpokládá se zde, že tag pre skutečně obsahuje nějaké bloky textu, takže se jich nevyskytuje více na jednom řádku.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.