gpt4 book ai didi

ruby - 使用 Mechanize 可以使这更容易吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:36 25 4
gpt4 key购买 nike

this帖子我了解到,在那个特定示例中,Ruby/Perl 中的 MechanizeHTML::TreeBuilder 3 更易于使用。

Mechanize 是否优于 HTML::TokeParser

使用 Mechanize 用 Ruby 编写下面的代码会更容易吗?

sub get_img_page_urls {
my $url = shift;

my $ua = LWP::UserAgent->new;
$ua->agent("$0/0.1 " . $ua->agent);
$ua->agent("Mozilla/8.0");

my $req = new HTTP::Request 'GET' => "$url";
$req->header('Accept' => 'text/html');

$response_u = $ua->request($req); # send request

die "Error: ", $response_u->status_line unless $response_u->is_success;

my $stream = HTML::TokeParser->new(\$response_u->content);

my %urls = ();

my $found_thumbnails = 0;
my $found_thumb = 0;

while (my $token = $stream->get_token) {

# <div class="thumb-box" ... >
if ($token->[0] eq 'S' and $token->[1] eq 'div' and $token->[2]{class} eq 'thumb-box') {
$found_thumbnails = 1;
}

# <div class="thumb" ... >
if ($token->[0] eq 'S' and $token->[1] eq 'div' and $token->[2]{class} eq 'thumb') {
$found_thumb = 1;
}

# <a ... >
if ($found_thumbnails and $found_thumb and $token->[0] eq 'S' and $token->[1] eq 'a') {
$urls{'http://example.com' . "$token->[2]{href}"} = 1;

# one url have been found. Now start all over.
$found_thumb = 0;
$found_thumbnails = 0;
}

}

return %urls;
}

最佳答案

就界面而言,任何东西都比 HTML::TokeParser 好。 WWW::Mechanize 以形式闪耀,但它也缺乏一种声明性的方式来查找某些元素。我喜欢Web::QueryHTML::Query谁在 jQuery 之后为他们的界面建模,据我所知,这种编程很受欢迎。

问题中的程序更短如下。它会自动引发异常,因此无需显式错误处理。

use URI;
use Web::Query 'wq';

sub get_img_page_urls {
my ($url) = @_;
$Web::Query::UserAgent = LWP::UserAgent->new(agent => 'Mozilla/8.0');

return map {
URI->new($_)->abs('http://example.com')->as_string # hash key
=> 1 # hash value
} wq($url)->find('div.thumb-box div.thumb a')->attr('href');
}

之前作为评论发布 https://stackoverflow.com/q/8274221#comment-10196381

关于ruby - 使用 Mechanize 可以使这更容易吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com