在perl中使用TokeParser从自包含标记中提取值

时间:2012-05-19 01:17:51

标签: perl html-parsing

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

我有一些看起来像这样的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只是忽略自包含的标签&lt; ... /&gt;。 为什么?我已经搜索了很长时间并且很难找到解决方案,并且非常感谢任何使用TokeParser或任何其他Perl模块的帮助......

谢谢!

2 个答案:

答案 0 :(得分: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
- img
- /: /
  alt: test
  class: someClass
  id: someId
  src: random.jpg
-
  - src
  - class
  - id
  - alt
  - /
- '<img src="random.jpg" class="someClass" id="someId" alt="test"/>'

BTW,HTML::TokeParser::Simple为您提供了更好的界面。

答案 1 :(得分:1)

看起来您有兴趣在html片段中捕获替代文字"test",给定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