Como analisar cem arquivos de código fonte html no shell?

21

Eu tenho um par de centenas de arquivos de código-fonte HTML. Eu preciso extrair o conteúdo de um determinado elemento <div> de cada um desses arquivos, então vou escrever um script para percorrer cada arquivo. A estrutura do elemento é assim:

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

Alguém pode sugerir um método pelo qual eu possa extrair o div the_div_id e todos os elementos filhos e conteúdo de um arquivo usando a linha de comando do linux?

    
por conorgriffin 24.01.2011 / 19:51

4 respostas

26

O pacote html-xml-utils , disponível na maioria das principais distribuições do Linux, tem um número de ferramentas que são úteis ao lidar com documentos HTML e XML. Particularmente útil para o seu caso é hxselect , que lê a entrada padrão e extrai elementos baseados em seletores CSS. Seu caso de uso seria semelhante:

hxselect '#the_div_id' <file

Você pode receber uma reclamação sobre a entrada não estar bem formada, dependendo do que você está alimentando. Esta queixa é dada por erro padrão e, portanto, pode ser facilmente suprimida, se necessário. Uma alternativa para isso seria usar o pacote HTML :: PARSER do Perl; no entanto, vou deixar isso para alguém com habilidades de Perl menos enferrujadas do que as minhas.

    
por 24.01.2011 / 20:22
9

Teste pup , uma ferramenta de linha de comando para processar HTML. Por exemplo:

pup '#the_div_id' < file.html
    
por 15.01.2016 / 18:57
4

Aqui está um script Perl não testado que extrai elementos <div id="the_div_id"> e seu conteúdo usando HTML::TreeBuilder .

#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
        my $html = $subtree->as_HTML;
        $html =~ s/(?<!\n)\z/\n/;
        print $html;
    }
    $tree = $tree->delete;
}

Se você é alérgico ao Perl, o Python tem HTMLParser .

P.S. Não tente usar expressões regulares. >.

    
por 24.01.2011 / 21:43
1

Aqui está o Ex one-liner para extrair essa parte de cada arquivo:

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

Para salvar / substituir no local, altere a seção -cqa! para -cxa e remova %p . Para recursividade, considere usar globbing ( **/*.html ).

Basicamente, para cada buffer / arquivo ( bufdo ), ele está executando as seguintes ações:

  • /pattern - encontre o padrão
  • norm - começa a simular batidas de tecla normais do Vi
    • n - pula para o próximo padrão (requerido no modo Ex)
    • vatd - remove a seção da tag externa selecionada (veja: pulando entre as tags html )
    • ggdG - remove o buffer inteiro (equivalente a :%d )
    • "2p - cole o texto excluído anteriormente

Talvez não seja muito eficiente e não POSIX ( :bufdo ), mas deve funcionar .

    
por 10.10.2015 / 14:36