1

我正在尝试做的事情听起来很容易,但不知何故我现在已经为此苦苦挣扎了几个小时,所以请指出我正确的方向:

我有一些看起来像这样的html:

<img src="random.jpg" class="someClass" id="someId" alt="test" />

目前我无法将此与此代码匹配:

my $tp = HTML::TokeParser->new(\$rawHTML) || die "Cant't open: $!";
while (my $token = $tp->get_token){
  my $ttype = shift @{ $token };
  if($ttype eq "S"){
    my($tag, $attr, $attrseq, $rawtxt) = @{ $token };
    if ($tag eq "img"){
      if(($attr->{'class'} eq "someClass")&&($attr->{'id'}eq "someId")){
        my $alttext = $attr->{'alt'};
        print "AltText: $alttext";
        ...
        }
      }        
    }
  }
}

似乎 TokeParser 只是忽略了自包含标签 <.../>。为什么?我已经为此寻找了长期而艰苦的解决方案,并且非常感谢任何帮助以使其与 TokeParser 或任何其他 Perl 模块一起使用...

谢谢!

4

2 回答 2

2

它不会忽略任何东西:

#!/usr/bin/env perl

use strict; use warnings;
use HTML::TokeParser;
use YAML;

my $html = q{<img src="random.jpg" class="someClass" id="someId" alt="test"/>};

my $parser = HTML::TokeParser->new( \$html );

while (my $token = $parser->get_token) {
    print Dump $token;
}

输出:

---
-S
- 图像
- /:/
  alt:测试
  类:someClass
  id: 一些Id
  来源:随机.jpg
-
  - 源代码
  - 班级
  - ID
  - 替代
  - /
- '<img src="random.jpg" class="someClass" id="someId" alt="test"/>'

顺便说一句,HTML::TokeParser::Simple为您提供了更好的界面。

于 2012-05-19T02:02:17.450 回答
1

看起来您有兴趣在"test"html 片段中捕获替代文本,给定someClasssomeId. 如果是这样,请尝试以下操作:

use Modern::Perl;
use Web::Query qw();

my $w = Web::Query->new_from_html(<<'HTML');
<img src="random.jpg" class="someClass" id="someId" alt="test" />
HTML

my @altText = $w->find('img[class="someClass"][id="someId"]')->attr('alt');

say @altText;

输出:

test
于 2012-05-19T02:02:08.487 回答