Script para construir página HTML a partir de DIVs extraídos de outras páginas HTML

StackOverflow https://stackoverflow.com/questions/1211718

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho um conjunto de relatórios HTML que contêm, cada um dois elementos div com IDs específicos que eu preciso retirar e compilar em um relatório global de síntese (mais uma vez, um arquivo HTML).

Meus pensamentos iniciais são de que este é um trabalho ideal para um script Perl, no entanto, não têm up-to-date in-house habilidades Perl (que é um .NET C # loja).

Os pensamentos e sugestões sobre abordagens recomendados seria bem-vinda ...

Foi útil?

Solução

Use um analisador HTML adequado; há HTML :: Parser para Perl e eu tenho certeza que há vários para C # como bem.

Outras dicas

Usando Perl, HTML :: TokeParser e HTML :: Template pode ajudar. Aqui está um exemplo rápido:

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TokeParser;
use HTML::Template;

use Data::Dumper;

my ($html_file) = @ARGV;

open my $html_handle, '<:utf8', $html_file
    or die "Cannot open '$html_file': $!";

my $parser = HTML::TokeParser->new( $html_handle );

my @divs;

while ( my $tag = $parser->get_tag('div') ) {
    my $attr = $tag->[1];
    next unless ref $attr eq 'HASH';
    next unless defined( my $id = $attr->{id} );
    next unless $id eq 'div1' or $id eq 'div2';

    my $div = $tag->[-1];
    my $in_wanted = 1;

    while ( $in_wanted ) {
        my $token = $parser->get_token;
        if ( $token->[0] eq 'T' ) {
            $div .= $token->[1];
        }
        else {
            $div .= $token->[-1];
        }
        my ($type, $name) = @$token[0, 1];
        if ( $name eq 'div' ) {
            $in_wanted += $type eq 'S' ?  1
                        : $type eq 'E' ? -1
                        : 0;
            next;
        }
        if ( $type eq 'E' and $name eq 'html' ) {
            warn "Warning: Reached the end of '$html_file'\n";
            last;
        }
    }

    push @divs, {DIV => $div};
}

print output( @divs );

sub output {
    my $tmpl_html = <<EO_TMPL;
<html>
<body>
<TMPL_LOOP DIVS>
    <TMPL_VAR DIV>
</TMPL_LOOP>
</body>
</html>
EO_TMPL
    my $tmpl = HTML::Template->new(
        scalarref => \$tmpl_html,
    );
    $tmpl->param( DIVS => \@_ );
    return $tmpl->output;
}

direto expressões regulares pode não ser suficiente se o seu div contém divs aninhadas. Isso ocorre porque o elemento de fechamento div não contém o ID, por isso é difícil para um regexp para coincidir com a marca de fechamento.

Se o seu div é:

<div id="findme">
    <!-- No other divs here! -->
</div>

Em seguida, você poderia usar uma expressão regular (apenas ter cuidado com a cobiça), uma versão mais elegante deste:

<div id="findme">(.*?)</div>

Nota: Im certeza que regexp não será executado, ele tem sido um tempo

Gostaria de olhar para usando uma biblioteca de parser HTML para analisar a estrutura e obter compensações de caracteres para o interior da div, e em seguida, tomar que vão desde o buffer. Usando uma biblioteca de HTML lhe permitirá analisar e encontrar onde o div que você quer extremidades.

Algo como este tutorial pode ser útil. Estes analisadores provavelmente lhe permitirá extrair os dados fechados em uma tag, como o seu div com precisão.

Você também pode usar um C # HTML parser , todos eles fazem um trabalho semelhante, basta olhar através da documentação para garantir que eles não apenas construiu árvores, e permitir-lhe obter compensações de caracteres para os dados div fechados (assim você pode extraí-lo) ou permitir o acesso a que os dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top