使用Web::Scraper提取javascript

Extracting javascript using Web::Scraper

本文关键字:javascript 提取 Scraper 使用 Web      更新时间:2023-09-26

我在使用Web::Scraper提取javascript时遇到了麻烦。下面是测试脚本:

#!/usr/bin/perl
use Modern::Perl;
use Web::Scraper;
use Data::Dumper;
my $contents = do { local $/; <DATA> };
my $scraper = scraper { process "//script", "scripts[]" => 'TEXT'; };
my $res = $scraper->scrape($contents);
say Dumper $res;
exit;
__DATA__
<html><head><title>hello</title></head>
<body>
  <script type="text/javascript">
    var dummy = {}
  </script>
</body>
</html>

和输出:

$VAR1 = {
          'scripts' => [
                         ''
                       ]
        };

在我看来,我正在寻找脚本标签,但没有保存标签之间的内容。

在深入研究xpath之后,我找到了解决方案。

更改刮刀线
my $scraper = scraper { process "//script", "scripts[]" => 'TEXT'; };

:

my $scraper = scraper { process "//script" => 'scripts[]' =>
                    scraper { process '//text()', 'script'=>'TEXT'} };

输出javascript代码:

$VAR1 = {
          'scripts' => [
                         {
                           'script' => '
    var dummy = {}
  '
                         }
                       ]
        };

我不相信流程线是简洁的,但它是有效的。

尝试RAW格式

#!/usr/bin/perl --
use strict;
use warnings;
use Web::Scraper;
use Data::Dump;
my $contents = q{
<html><head><title>hello</title></head>
<body>
  <script type="text/javascript">
    var dummy = {}
  </script>
</body>
</html>};
#~ my $scraper = scraper { process "//script", "scripts[]" => 'TEXT'; };
my $scraper = scraper { process "//script", "scripts[]" => 'RAW'; };
my $res = $scraper->scrape($contents);
dd $res;
__END__
{ scripts => ["'n    var dummy = {}"] }