我有一组HTML报告,每个报告都包含两个具有特定ID的DIV元素,我需要将其删除并编译成一个总体摘要报告(同样是一个HTML文件)。

我最初的想法是,这是Perl脚本的理想工作,但我们没有最新的内部Perl技能(我们是.NET C#商店)。

欢迎对推荐方法的想法和建议......

有帮助吗?

解决方案

使用合适的HTML解析器;对于Perl,我有 HTML :: Parser ,我确信有几个用于C#的好。

其他提示

使用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;
}

如果您的div包含嵌套的div,则直接正则表达式可能不够。这是因为结束div元素不包含ID,因此regexp很难匹配结束标记。

如果你的div是:

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

然后你可以使用正则表达式(只是要小心贪婪),这是一个更优雅的版本:

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

注意:我很确定regexp不会运行,已经有一段时间了!

我会研究使用HTML解析器库来解析结构并获取div内部的字符偏移量,然后从缓冲区中取出该范围。使用HTML库可以解析并找到想要结束的div的位置。

本教程可能有用。这些解析器可能允许您准确地提取标记中包含的数据,例如div。

您还可以使用 C#HTML解析器 ,他们都做了类似的工作,只需查看文档以确保他们不仅构建树,并允许您获取所包含的div数据的字符偏移(以便您可以提取它)或允许访问那个数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top