1

テキストを抽出する必要があるhtmlファイルがたくさんありますが、リストの内容は抽出しません。htmlは次のようになります

<html>

    <Head>
        <title>intranet mycompany</title>
    </head>

    <body>
        <div>blah</div>
        <p>the text i need to extract
            <br>
            <ul>
                <li>stuff i don't want.</li>
                <li>more stuff i don't want.</li>
            </ul>More text i need to exctract.</p>
    </body>

</html>

リストからテキストではなく、段落からテキストを取得する方法についてのアドバイスが本当に欲しいです。アドバイスをいただければ幸いです。

よろしく、ジョンボ。

4

4 に答える 4

4
use strictures;
use HTML::TreeBuilder::XPath qw();
my $dom = HTML::TreeBuilder::XPath->new_from_content(q(<html> … </body>));
my ($ul) = $dom->findnodes('//ul');
$ul->delete;
my $extract = $dom->findvalue('//p');
# " the text i need to extract  More text i need to exctract. "
于 2012-04-19T13:02:55.030 に答える
0

CPAN for HTML Parsers を見てください。 HTML::TreeBuilderHTML::Parserなどのような素敵なパーサーが得られます。

于 2012-04-19T12:06:12.090 に答える
0

データを削除する方法は次のとおりです<ul>。HTML::Parser は、テキスト ハンドラーを呼び出すときにドキュメント内のどこにあるかを認識していないため、その情報を提供する何らかの方法を見つける必要があります。

start_handler各開始要素に対して呼び出される に、openend に関するメモを作成し、そのメモ<ul>end_handler削除するように指示するだけです。その後、 内の情報を利用して、 内text_handlerのテキスト ノードをスキップできます<ul>s

#!/usr/bin/perl -w
use strict;
use HTML::Parser;

my $text = '';
my $parser = HTML::Parser->new(
  start_h => [ \&start_handler, "self,tagname" ],
  end_h   => [ \&end_handler,   "self,tagname" ],
  text_h  => [ \&text_handler,  "self,dtext" ],
);

sub start_handler {
  my ($self, $tag) = @_;
  $self->{_private}->{'ul'} = 1 if ( $tag eq 'ul' ); # make a note
}

sub end_handler {
  my ($self, $tag) = @_;
  $self->{_private}->{'ul'} = 0 if ( $tag eq 'ul' ); # remove the note
}

sub text_handler {
  my ($self, $dtext) = @_;
  unless ($self->{_private}->{'ul'}) {
    # only if we're not inside the <ul>
    $text .= $dtext;
  }
}
$parser->parse_file('test.html');
print $text;
于 2012-04-19T13:36:16.387 に答える
-4

最も難しいのは、データが複数の行にまたがっていることです。すべての行を 1 つの大きな文字列に結合する場合、次のような単純な正規表現

s/<ul>.*<\/ul>//g

やるべきです。

于 2012-04-19T12:06:16.787 に答える