【问题标题】:How can I access the contents of a JavaScript driven web page with Perl?如何使用 Perl 访问 JavaScript 驱动的网页的内容?
【发布时间】:2015-05-22 11:38:02
【问题描述】:

我正在尝试使用 Perl 制作一个小应用程序,以从 LolKing 获取英雄联盟的召唤师姓名。

HTML 代码有类似的行

<tr data-summonername="MatLife TriHard" class="lb_row_rank_4">

所以我只是用类似的东西

use strict;
use warnings;

use LWP::Simple;
use HTML::Parser;

my $find_links = HTML::Parser->new(
  start_h => [
    sub {
      my ($tag, $attr) = @_;
      if ($tag eq 'tr' and exists $attr->{'data-summonername'}) {
        print "$attr->{'data-summonername'}\n";
      }
    },
    "tag, attr"
  ]
);

my $html = get('http://www.lolking.net/leaderboards/#/na/1') or die 'nope';

$find_links->parse($html);

但这没有给我任何东西。即使使用attr=class,它也没有给我任何东西。由于某种原因,我无法获取 tr 元素的类。

使用不带单引号的$attr-&gt;{data-summonername} 给了我一些错误,因为我想是连字符。如果我获取 $attr-&gt;{href} 它就可以了。

谁能帮帮我?

【问题讨论】:

标签: javascript html perl parsing


【解决方案1】:

问题在于,该页面的 HTML 主要是在页面下载后由您的浏览器使用 JavaScript 构建的。使用 LWP::Simple::get 将只检索框架 HTML 和 JavaScript 代码。你可以看到如果你print $html而不是解析它。

通常的解决方案是使用WWW::Mechanize::Firefox,它会获取已安装的 Firefox 来下载并构建您可以查询的页面。不过,它比简单的get 复杂得多,因为如果您还没有 Firefox,则必须安装它,以及启用远程控制的 Mozilla MozRepl 插件。即使这样,在浏览器完成构建页面之前,您仍然可能会遇到访问页面内容的问题,因此不适合胆小的人。


更新

为了您的兴趣,这里有一个使用WWW::Mechanize::Firefox 的解决方案。

use strict;
use warnings;

use WWW::Mechanize::Firefox;
use HTML::TreeBuilder::XPath;

my $url = 'http://www.lolking.net/leaderboards/#/na/1';

my $mech = WWW::Mechanize::Firefox->new;
my $resp = $mech->get($url);
die $resp->status_line unless $resp->is_success;

my $tree = HTML::TreeBuilder::XPath->new_from_content($resp->content);

for my $node ( $tree->findnodes('//tr[starts-with(@class, "lb_row_rank")]') ) {
  printf "Rank %2d: %s\n",
      $node->attr('class') =~ /(\d+)/,
      $node->attr('data-summonername');
}

输出

Rank  1: Doublelift
Rank  2: F5 Veritas
Rank  3: Life Love Live 
Rank  4: MatLife TriHard
Rank  5: TDK Kyle
Rank  6: Liquid FeniX
Rank  7: Liquid Inori TV
Rank  8: dawoofsclaw
Rank  9: who is he
Rank 10: Ohhhq

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 2010-11-10
    • 2011-07-18
    • 1970-01-01
    • 2020-06-12
    • 2013-09-11
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多