다른 html 페이지에서 추출 된 div에서 html 페이지를 빌드하는 스크립트

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

  •  06-07-2019
  •  | 
  •  

문제

HTML 보고서 세트가 있습니다. 각각은 전체 요약 보고서 (다시 HTML 파일)를 벗기고 컴파일 해야하는 특정 ID가있는 두 개의 div 요소가 포함되어 있다는 일련의 HTML 보고서가 있습니다.

나의 초기 생각은 이것이 Perl 스크립트에 이상적인 일이지만 최신 사내 Perl 기술이 없다는 것입니다 (우리는 .NET C# Shop입니다).

권장 접근법에 대한 생각과 제안은 환영받을 것입니다 ...

도움이 되었습니까?

해결책

적절한 HTML 파서를 사용하십시오. 거기 있습니다 html :: 파서 Perl과 C#에 대한 몇 가지가 있다고 확신합니다.

다른 팁

Perl 사용, html :: Tokeparser 그리고 html :: 템플릿 도울 수있다. 다음은 빠른 예입니다.

#!/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에 중첩 된 divs가 포함 된 경우. 닫는 div 요소에 ID가 포함되어 있지 않기 때문에 regexp가 닫기 태그와 일치하기가 어렵 기 때문입니다.

당신의 div 인 경우 :

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

그런 다음 더 우아한 버전 인 정규 표현 (욕심에 대해 조심하십시오)을 사용할 수 있습니다.

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

참고 : Regexp가 실행되지 않을 것이라고 확신합니다. 오랜 시간이 지났습니다!

HTML 파서 라이브러리를 사용하여 구조를 구문 분석하고 DIV 내부의 문자 오프셋을 얻은 다음 해당 범위를 버퍼에서 가져옵니다. HTML 라이브러리를 사용하면 원하는 div가 끝나는 곳을 찾아서 찾을 수 있습니다.

같은 것 이 튜토리얼 유용 할 수 있습니다. 이 파서는 아마도 DIV와 같은 태그로 둘러싸인 데이터를 정확하게 추출 할 수 있습니다.

당신은 또한 a를 사용할 수 있습니다 C# HTML 파서, 그들은 모두 비슷한 작업을 수행하고, 문서를 살펴보고, 단지 나무를 건축하지 않도록하고, 동봉 된 div 데이터에 대한 문자 오프셋을 얻거나 해당 데이터에 액세스 할 수 있도록 허용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top