Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用HTML::TokParser::Simple进行HTML解析_Perl_Html Parsing - Fatal编程技术网

Perl 使用HTML::TokParser::Simple进行HTML解析

Perl 使用HTML::TokParser::Simple进行HTML解析,perl,html-parsing,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

我正在用
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文档内容:

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

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

测试HTML

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

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


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

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


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

我相信你只需要使用
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模块()中改编了它,该模块有很多方便的方法可以帮助您。它基本上充当对象中的web浏览器。

我相信您只需要使用
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模块()中改编了它,该模块有很多方便的方法可以帮助您。它基本上充当对象中的web浏览器。

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

   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";
      }
    }

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

   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";
      }
    }