shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Editar HTML com SED


From: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] Editar HTML com SED
Date: Thu, 15 Mar 2007 13:30:56 -0300

Alain, nem tudo está perdido.

Existem 2 formas um tanto não-ortodoxas de remover estas divs completamente.

Estou falando de vc, via SED, inserir um codigo css ou javascript na
pagina para que não mostre estas divs no seu browser. Se o navegador
que vc usa no palm suporta um destes recursos, fica facil.

Entretanto vc pode fazer uma boa combinação de tecnicas de
transformação de texto para solucionar o seu problema de forma 100%
shell

primeiro imagine o seguinte arquivo:

$ cat index.html
<html>
<head>jghljkhsdfklgsdf</head>
<body>
<div id="A">A</div>
<div id="B">B</div>
<div id="C">C</div>
<div id="D">
<div id="E">E</div>
</div>
</body>
</html>

Bom, vc tem 5 divs, sendo que a div E está dentro da div D

Vc simplesmente ABOMINA as divs B e D, com tudo o que estiver dentro
delas. Viveria MUITO melhor sem elas. Como fazer pra acabar com a raça
delas?

Se o arquivo fosse assim

aaaa;BBBB;ccc;DDD

seria facil apagar os campos BBBB e DDD - é um arquivo delimitado por
um caracter específico. E arquivos delimitador por um caracter
específico são faceis de trabalhar via awk. no caso do arquivo html vc
não tem este 'caracter' mas, e se colocassemos algo como '£' (simbolo
de libra) para demarcar os campos?

sed 's|</*div[^>]*>|£&£|g' index.html

dessa forma todos as tags <div> e </div> ficam 'delimitadas'. Por que isso?

Ora... eu digo para o awk ler campo por campo, cada campo é definido
como sendo um conjunto de caracteres delimitado por libra, quando eu
encontrar um <div id=oqueeuquero> eu entro no modo 'apagar'. só irei
sair quando encontrar um correspondente fim a esta <div>, que seria um
</div>!

awk -v RS='£' 'BEGIN{ J=0;}
/^<div/{
if ($0 ~ /id="(B|D)"/) J=1;
else if (J > 0) J++;
}
(J == 0){print}
/^<\/div/{ if (J > 0) J--; }'

o que isso faz? quando encontrar um id que eu não gosto, ele diz para
o J ser 1. sendo diferente de zero, ele nunca sera impresso! J só
voltara a ser zero quando o respectivo final dessa div for encontrado
-- por isso eu incremento e decremento J, pois eu posso ter uma div
dentro da outra, como no caso do E dentro do D

sed 's|</*div[^>]*>|£&£|g' index.html  |  awk -v RS='£' 'BEGIN{ J=0;}
/^<div/{
if ($0 ~ /id="(B|D)"/) J=1;
else if (J > 0) J++;
}
(J == 0){print}
/^<\/div/{ if (J > 0) J--; }'

Bacana heim? o simbolo de libra é 'comido' pelo awk, o html fica com
umas quebras de linha a mais, porem o resultado é :

<html>
<head>jghljkhsdfklgsdf</head>
<body>

<div id="A">
A
</div>




<div id="C">
C
</div>



</body>
</html>

como o browser ignora estes espaços a mais, fica tudo numa boa, mas se
vc quer algo bonito pode colocar mais um pipe para um tr -s '\n'

B e D foram pro saco, não foi preciso apelar para C, Lisp, Pascal ou
mesmo Javascript (embora um style:none [css] possa produzir um efeito
semelhante). Agora é questão de vc testar em um HTML real, por que
pode haver muitos casos que não funciona 100%

Deu trabalho, mas minha hora de almoço foi rapida. Outro uso pratico
dessa tecnica poderia ser algum XML de configuração de algum programa,
ou mesmo um arquivo de configuração que não seja obvio como devemos
edita-lo.

[]´s

Tiago (e não perca a fé no shell)
On 3/14/07, Alain M. <address@hidden> wrote:






Última chamada... visto ninguém mais fazer comentário, deduzo que não é
 possível resolver este problema com alguma ferramenta de shell.
 Começarei a estudar a solução em "C"

 Se alguém ainda tiver uma sugestão, por favor me avise antes que eu
 começe ;-)

 Grato,
 Alain

 Alain M. escreveu:

 > Oi Bruno,
 >
 > Sim os "ids" dos divs são específicos.
 >
 > Respondi na minha própria mensagem porque tem o exemplo simplificado em
 > baixo, um exemplo do texto original seria esta página:
 >    http://g1.globo.com/Noticias/0,,MUL9810-5603-1853,00.html
 > e manda salvar como... ou abre direto o código fonte. Por exemplo nesta
 > página eu quero apagar os tags:
 >    <div id="glbBarra"
 >    <div id="lateral">
 >
 > O exemplo abaixo deveria servir para testes, acho que contém todos os
 > casos encontrados
 >
 > Espero encontrar uma solução sem ter que escrever um programa sm C...
 >
 > Alain
 >
 > Alain M. escreveu:
 >> Ok, Bruno, não fui claro novamente, vou tentar de novo
 >>
 >> Na página, tem vários tags quecomeçam com "<div" eu quero tirar uma
 >> delas, no meu exemplo a que começa com '<div id="Label"' até o "</div>"
 >> *correspondente*.
 >>
 >> Só que dentro desse div tem outro div, então tem que achar o
 >> correspondente, independentemente de quantos tem aninhados dentro.
 >>
 >> Alain
 >>
 >> Bruno Gunter Fricke escreveu:
 >>> Alain,
 >>>
 >>> Você precisa encontrar um ponto em comum em seu texto para usar o sed.
 >>> Você quer manter algumas "divs" e outras não.  Não tem como fazer o que 
você deseja se não for informado exatamente o que você precisa cortar do texto.
 >>>
 >>>   Agradeço pelas dicas, mas acho que me expliquei mal.
 >>>
 >>>   Dica do Tiago: sed '/^<div/,/^<\/div/d' arquivo
 >>>   Dica do Flavio: tr '\n' '#' < txt | sed 's/<.*>//' | tr '#' '\n'
 >>>
 >>>   Na verdade eu quero é tirar um TAG específico no meio de uma página
 >>>   grande em html. Refiz meu exemplo para ficar mais claro, eu preciso
 >>>   tirar o TAG que começa com: <div id="Label"
 >>>
 >>>   -----Original-----
 >>>   texto que fica <div class="Lxx">também fica</div>
 >>>   <div id="Label" class="x1024">
 >>>   mais texto
 >>>   <div class="Label2"></div>
 >>>   lixo</div>
 >>>   mais um que fica <div class="Lyy">ficante ídem</div>
 >>>
 >>>   -----editado------
 >>>   texto que fica <div class="Lxx">também fica</div>
 >>>   mais um que fica <div class="Lyy">ficante ídem</div>
 >>>
 >>>   Só por curiosidade, a idéia é limpar páginas para ler offline no Palm.
 >>>   Por exemplo:
 >>>   http://g1.globo.com/Noticias/0,,MUL9810-5603-1853,00.html
 >>>
 >>>   Mais uma vez, grato,
 >>>   Alain
 >
 >
 >
 > ----------------------------------------------------------
 > Esta lista não admite a abordagem de outras liguagens de programação, como 
perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio aviso.
 > ----------------------------------------------------------
 > Sair da lista: address@hidden
 > ----------------------------------------------------------
 > Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
 > ----------------------------------------------------------
 > Servidor Newsgroup da lista: news.gmane.org
 > Grupo: gmane.org.user-groups.programming.shell.brazil
 >
 >
 > Links do Yahoo! Grupos
 >
 >
 >
 >





--
Tiago B Peczenyj
Linux User #405772

# cd /pub
# more beer


reply via email to

[Prev in Thread] Current Thread [Next in Thread]