使用HTML :: TokeParser :: Simple进行HTML解析

时间:2013-09-13 17:24:22

标签: perl html-parsing

我正在使用HTML::TokeParser::Simple解析HTML文件。 HTML文件的内容如下所示。我的问题是,我试图忽略JavaScript显示为文本内容。例如:

use HTML::TokeParser::Simple;
my $p = HTML::TokeParser::Simple->new( 'test.html' );

while ( my $token = $p->get_token ) {
    next unless $token->is_text;
    print $token->as_is, "\n";
}

这将打印输出,如下所示:

Test HTML

<!--
  var form_submitted = 0;

  function submit_form() {
    [..]
  }
 //-->

实际的HTML文档内容:

<html>
<span>Test HTML</span>
<script type="text/javascript">
<!--
  var form_submitted = 0;

  function submit_form() {
    [..]
  }
 //-->
</script>
</html>

如何忽略显示的JavaScript标记内容。

3 个答案:

答案 0 :(得分:1)

我得到了理想的结果。评论(正确地)不被我的版本视为文本。看起来您需要升级您正在使用的模块。 (我使用HTML :: Parser 3.69和HTML :: TokeParser :: Simple 3.15。)

>perl a.pl
Test HTML



>

您仍然需要处理HTML实体并有用地格式化文本,后者非常困难,因为您删除了所有格式化指令。你的方法似乎有致命缺陷。

答案 1 :(得分:0)

我相信您只需要使用as_text方法。

    my $tree = HTML::TreeBuilder->new();
    $tree->parse( $html );
    $tree->eof();
    $tree->elementify(); # just for safety
    my $text = $tree->as_text();
    $tree->delete;

我从WWW :: Mechanize模块(http://search.cpan.org/dist/WWW-Mechanize/)改编了这个模块,它有许多方便的方法可以帮到你。它基本上充当对象中的Web浏览器。

答案 2 :(得分:0)

扫描令牌以忽略所有打开和关闭的脚本标记。请参阅下面用于解决问题。

   my $ignore=0;

   while ( my $token = $p->get_token ) {

      if ( $token->is_start_tag('script') ) {
         print $token->as_is, "\n";
         $ignore = 1;
         next;
      }
      if ( $token->is_end_tag('script') ) {
         $ignore = 0;
         print $token->as_is, "\n";
         next;
      }
      if ($ignore) {
         #Everything inside the script tag. Here you can ignore or print as is
         print $token->as_is, "\n";
      }
      else
      {  
          #Everything excluding scripts falls here handle as appropriate
          next unless $token->is_text;
          print $token->as_is, "\n";
      }
    }