Script para construir página HTML a partir de DIVs extraídos de outras páginas HTML
-
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 ...
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.