Portál AbcLinuxu, 10. listopadu 2025 07:14
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.