3

<span class="postertrip">HTML ファイルを開き、タグ内に含まれるすべてのものを抽出する Perl スクリプトを作成しようとしています。

サンプル HTML:

<table>
   <tbody>
      <tr>
         <td class="doubledash">&gt;&gt;</td>
         <td class="reply" id="reply2">
            <a name="2"></a> <label><input type="checkbox" name="delete" value="1199313466,2" /> <span class="replytitle"></span> <span class="commentpostername"><a href="test">Test1</a></span><span class="postertrip"><a href="test">!AAAAAAAA</a></span>  08/01/03(Thu)02:06</label> <span class="reflink"> <a href="test">No.2</a> </span>&nbsp;  <br /> <span class="filesize">File: <a target="_blank" href="test">1199326003295.jpg</a> -(<em>65843 B, 288x412</em>)</span> <span class="thumbnailmsg">Thumbnail displayed, click image for full size.</span><br />  <a target="_blank" test"> <img src="test" width="139" height="200" alt="65843" class="thumb" /></a>    
            <blockquote>
               <p>Test message 1</p>
            </blockquote>
         </td>
      </tr>
   </tbody>
</table>
<table>
   <tbody>
      <tr>
         <td class="doubledash">&gt;&gt;</td>
         <td class="reply" id="reply5">
            <a name="5"></a> <label><input type="checkbox" name="delete" value="1199313466,5" /> <span class="replytitle"></span>  <span class="commentpostername">Test2</span><span class="postertrip">!BBBBBBBB</span> 08/01/03(Thu)16:12</label> <span class="reflink"> <a href="test">No.5</a> </span>&nbsp;  
            <blockquote>
               <p>Test message 2</p>
            </blockquote>
         </td>
      </tr>
   </tbody>
</table>
<table>
   <tbody>
      <tr>
         <td class="doubledash">&gt;&gt;</td>
         <td class="reply" id="reply7">
            <a name="7"></a> <label><input type="checkbox" name="delete" value="1199161229,7" /> <span class="replytitle"></span>  <span class="commentpostername">Test3</span><span class="postertrip">!CCCCCCCC.</span> 08/01/01(Tue)17:53</label> <span class="reflink"> <a href="test">No.7</a> </span>&nbsp;  
            <blockquote>
               <p>Test message 3</p>
            </blockquote>
         </td>
      </tr>
   </tbody>
</table>

望ましい出力:

!AAAAAAAA
!BBBBBBBB
!CCCCCCCC

現在のスクリプト:

#!/usr/bin/env perl

use warnings;
use strict;
use 5.010;

use HTML::TreeBuilder;


open(my $html, "<", "temp.html")
        or die "Can't open";


my $tree = HTML::TreeBuilder->new();
$tree->parse_file($html);


foreach my $e ($tree->look_down('class', 'reply')) {
    my $e = $tree->look_down('class', 'postertrip');
    say $e->as_text;
}

スクリプトの不適切な出力:

!AAAAAAAA
!AAAAAAAA
!AAAAAAAA
4

2 に答える 2

5

foreach-loop では、見つけた要素から見下ろす必要があります。したがって、正しいコードは次のとおりです。

foreach my $parent ($tree->look_down('class', 'reply')) {
    my $e = $parent->look_down('class', 'postertrip');
    say $e->as_text;
}
于 2020-06-07T08:09:48.323 に答える
5

私は HTML::TreeBuilder が好きではありませんでした。ちょっと複雑なごちゃごちゃで、3年間更新されていません。ただし、 Mojo::DOMで CSS セレクターを使用するのは非常に簡単です。さまざまなs が行うfindすべての作業を行います。look_down

use v5.10;
use Mojo::DOM;

my $html = do { local $/; <DATA> };

my @values = Mojo::DOM->new( $html )
    ->find( 'td.reply span.postertrip' )
    ->map( 'all_text' )
    ->each;

say join "\n", @values;

HTML::TreeBuilder コードには、関心のあるタグを選択するロジックがないことに注意してください。できますが、追加の作業が必要です。CSS セレクターがそれを処理します。

于 2020-06-07T08:10:08.020 に答える