使用 Perl 和 Gtk3::WebKit 解析动态页面
Parsing a dynamic page with Perl and Gtk3::WebKit
我正在使用 Gtk3::WebKit 解析一个使用 JavaScript 加载内容的网站。加载站点时,它会向 DOM:
添加多个包含内容的 div
<div class="product-card">...</div>
如何使用 Gtk3::WebKit 获取此内容?如何获取嵌套标签的内容?是否有关于 Gtk3::WebKit 的正常文档,因为我已经看到的所有内容都很少记录。
这是一个使用 Gtk3::WebKit2 的例子:
use feature qw(say);
use strict;
use warnings;
use Gtk3 -init;
use Gtk3::WebKit2;
use Gtk3::JavaScriptCore;
{
my $url = 'https://metacpan.org/pod/Gtk3::WebKit2';
my $window = Gtk3::Window->new('toplevel');
$window->set_default_size(800, 600);
$window->signal_connect(destroy => sub { Gtk3->main_quit() });
my $ctx = Gtk3::WebKit2::WebContext::get_default();
my $view = Gtk3::WebKit2::WebView->new_with_context($ctx);
$view->signal_connect('load-changed', sub {
my ($view, $load_event) = @_;
if ($load_event eq 'finished') {
run_javascript(
$view,
'document.getElementsByClassName("logged_out")[1].innerHTML;'
);
}
});
$view->load_uri($url);
my $scrolls = Gtk3::ScrolledWindow->new();
$scrolls->add($view);
$window->add($scrolls);
$window->show_all();
Gtk3::main_iteration while Gtk3::events_pending;
Gtk3->main;
}
sub run_javascript {
my ($view, $javascript_string) = @_;
my $done = 0;
$view->run_javascript($javascript_string, undef, sub {
my ($object, $result, $user_data) = @_;
my $value = $view->run_javascript_finish($result)->get_js_value;
say $value->to_string;
$done = 1;
return "ok";
}, undef);
Gtk3::main_iteration while Gtk3::events_pending and not $done;
}
输出:
<a href="" onclick="alert('Please sign in to add favorites'); return false" class="favorite highlight" title="Add to favorites">
<span>2</span> ++</a>
我正在使用 Gtk3::WebKit 解析一个使用 JavaScript 加载内容的网站。加载站点时,它会向 DOM:
添加多个包含内容的 div<div class="product-card">...</div>
如何使用 Gtk3::WebKit 获取此内容?如何获取嵌套标签的内容?是否有关于 Gtk3::WebKit 的正常文档,因为我已经看到的所有内容都很少记录。
这是一个使用 Gtk3::WebKit2 的例子:
use feature qw(say);
use strict;
use warnings;
use Gtk3 -init;
use Gtk3::WebKit2;
use Gtk3::JavaScriptCore;
{
my $url = 'https://metacpan.org/pod/Gtk3::WebKit2';
my $window = Gtk3::Window->new('toplevel');
$window->set_default_size(800, 600);
$window->signal_connect(destroy => sub { Gtk3->main_quit() });
my $ctx = Gtk3::WebKit2::WebContext::get_default();
my $view = Gtk3::WebKit2::WebView->new_with_context($ctx);
$view->signal_connect('load-changed', sub {
my ($view, $load_event) = @_;
if ($load_event eq 'finished') {
run_javascript(
$view,
'document.getElementsByClassName("logged_out")[1].innerHTML;'
);
}
});
$view->load_uri($url);
my $scrolls = Gtk3::ScrolledWindow->new();
$scrolls->add($view);
$window->add($scrolls);
$window->show_all();
Gtk3::main_iteration while Gtk3::events_pending;
Gtk3->main;
}
sub run_javascript {
my ($view, $javascript_string) = @_;
my $done = 0;
$view->run_javascript($javascript_string, undef, sub {
my ($object, $result, $user_data) = @_;
my $value = $view->run_javascript_finish($result)->get_js_value;
say $value->to_string;
$done = 1;
return "ok";
}, undef);
Gtk3::main_iteration while Gtk3::events_pending and not $done;
}
输出:
<a href="" onclick="alert('Please sign in to add favorites'); return false" class="favorite highlight" title="Add to favorites">
<span>2</span> ++</a>