2009-07-31 3 views
1

У меня есть набор отчетов HTML, каждый из которых содержит два элемента DIV с определенными идентификаторами, которые мне нужно снять и скомпилировать в общий итоговый отчет (опять же, HTML файл).Сценарий для создания HTML-страницы из извлеченных DIV с других HTML-страниц

Мои первоначальные мысли состоят в том, что это идеальная работа для скрипта Perl, однако у нас нет современных встроенных навыков Perl (мы являемся магазином .NET C#).

мысли и предложения о рекомендуемых подходах будут приветствоваться ...

ответ

4

Используйте подходящий HTML анализатор; для Perl есть HTML::Parser, и я уверен, что для C# тоже несколько.

1

Прямоугольные регулярные выражения могут быть недостаточно, если ваш div содержит вложенные div. Это связано с тем, что элемент закрывающего div не содержит идентификатор, поэтому регулярное выражение трудно сопоставить с закрывающим тегом.

Если DIV является:

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

Тогда вы могли бы использовать регулярное выражение (просто быть осторожным алчности), более элегантную версию этого:

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

Примечание: Im довольно что regexp не будет запускаться, прошло какое-то время!

Я хотел бы изучить библиотеку анализатора HTML, чтобы проанализировать структуру и получить смещения символов для внутренней части div, а затем взять этот диапазон из буфера. Использование библиотеки HTML позволит вам разобрать и найти, где заканчивается div.

Возможно, что-то вроде this tutorial. Эти синтаксические анализаторы, вероятно, позволят вам точно отображать данные, заключенные в тег, например ваш div.

Вы также можете использовать C# HTML parser, все они делают подобную работу, просто ознакомиться с документацией, чтобы убедиться, что они не только построили деревья, и позволяют получить характер смещения для вложенных данных Div (так что вы может извлечь его) или разрешить доступ к этим данным.

+1

Нет необходимости в негативном взгляде (что на самом деле?! Не!?). m {< div id = "findme" > (. *?) </div >} будет работать до тех пор, пока нет вложенных div. – friedo

+0

Приветствия! .... ... –

2

Использование Perl, HTML::TokeParser и HTML::Template может помочь. Вот краткий пример:

#!/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; 
}