1

我正在解析一个带有HTML::TokeParser::Simple. 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显示的标签内容。

4

3 回答 3

1

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

>perl a.pl
Test HTML



>

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

于 2013-09-13T19:18:53.123 回答
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/ ) 改编了这个,它有很多可以帮助你的便捷方法。它基本上充当对象中的网络浏览器。

于 2013-09-14T01:24:04.377 回答
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";
      }
    }
于 2013-09-16T13:03:42.537 回答