【问题标题】:Parsing a dynamic page with Perl and Gtk3::WebKit使用 Perl 和 Gtk3::WebKit 解析动态页面
【发布时间】:2021-06-21 03:48:24
【问题描述】:

我正在使用 Gtk3::WebKit 来解析一个使用 JavaScript 将内容加载到自身的网站。加载网站时,它会向 DOM 添加多个带有内容的 div:

<div class="product-card">...</div>

如何使用 Gtk3::WebKit 获取此内容?如何获取嵌套标签的内容?是否有关于 Gtk3::WebKit 的普通文档,因为我已经看到的所有内容都记录得很差。

【问题讨论】:

  • 注意:在 Ubuntu 20.04 上,似乎需要的软件包 gir1.2-webkit-3.0 已被弃用,请参阅 this 链接,我无法在此处安装 Gtk3::WebKit..
  • 注意:Gtk3::WebKit2 提供更新的 WebKit2 绑定。

标签: perl parsing webkit gtk3


【解决方案1】:

这是使用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>

【讨论】:

  • 这不是我真正需要的,但它解释了很多。你能推荐一下手册吗?
  • 对您有帮助太好了!我认为手册是here,因为perl 模块只是使用Glib::Object::Introspection 来动态创建与WebKitGTK C 库的Perl 绑定。例如,$view-&gt;run_javascript_finish() 方法记录在 here
猜你喜欢
  • 2023-04-01
  • 2013-08-20
  • 1970-01-01
  • 2019-11-02
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多