السيناريو بناء صفحة HTML من استخراج DIVs عن غيرها من صفحات HTML

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

  •  06-07-2019
  •  | 
  •  

سؤال

لدي مجموعة من تقارير HTML التي تحتوي كل منها على اثنين DIV العناصر مع معرفات محددة التي تحتاج إلى خارج الشريط وتجميع إلى تقرير موجز (مرة أخرى ، ملف HTML).

بلدي الأفكار الأولية هي أن هذا هو وظيفة مثالية بالنسبة Perl, ومع ذلك ليس لدينا ما يصل إلى تاريخ في بيت بيرل المهارات (نحن .NET C# متجر).

الأفكار والاقتراحات على النهج الموصى بها سيكون موضع ترحيب...

هل كانت مفيدة؟

المحلول

استخدم محلل HTML مناسبة. هناك HTML :: محلل للحصول على بيرل وأنا متأكد من أن هناك عدة لC # كما أيضا.

نصائح أخرى

وعن طريق بيرل، HTML :: TokeParser و <لأ href = "HTTP : //search.cpan.org/perldoc/HTML :: قالب "يختلط =" نوفولو noreferrer "> 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 لا يحتوي على الهوية ، لذلك فمن الصعب على 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