Autotrader的网站上有一个名为' searchVehicle'的表格。在该表单中,给定表单输入字段qr/^(radius|make|model|price-to)
有许多HTML值。这些值正如您所期望的那样,即下拉列表。如何提取<option>
&#39;
到目前为止,我有以下Perl代码:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use WWW::Mechanize;
use Data::Dumper;
use JSON;
binmode STDOUT, ':encoding(UTF-8)';
binmode STDIN, ':encoding(UTF-8)';
my $url = 'https://www.autotrader.co.uk/';
my $mech = WWW::Mechanize -> new( autocheck => 1 );
$mech -> agent_alias( 'Linux Mozilla');
if ($mech -> status( $mech -> get($url)) == 200)
{
$mech -> form_name('searchVehicles');
my @inputs = $mech -> find_all_inputs(
name_regex => qr/^(radius|make|model|price-to)$/,
type => 'option',);
print Dumper \@inputs;
};
我的结果如下:
$VAR1 = [
bless( {
'idx' => 1,
'type' => 'option',
'current' => 0,
'name' => 'radius',
'menu' => [
{
'name' => 'Select the distance',
'seen' => 1,
'value' => ''
}
],
'id' => 'radius',
'aria-label' => 'Choose a radius',
'class' => 'c-form__select'
}, 'HTML::Form::ListInput' ),
bless( {
}, 'HTML::Form::ListInput' ),
bless( {
}, 'HTML::Form::ListInput' ),
bless( {
}, 'HTML::Form::ListInput' )
];
注意:我已经截断了除了第一个之外的所有内容,因为你得到了第一个的想法。
'HTML::Form::ListInput'
值?答案 0 :(得分:3)
WWW::Mechanize::find_all_inputs的文档说
find_all_inputs()返回当前表单中所有输入控件的数组,其中的属性与传入的所有正则表达式匹配。返回的控件都来自HTML :: Form :: Input。有关详细信息,请参阅"INPUTS" in HTML::Form。
因此,您的INPUTS
是HTML::Form个对象的数组。
从给定的链接到name
部分,我们找到了value
,value_names
,action
等许多方法。这是您用来提取所需信息的内容。
提供的实际网站的更新
但是,此网站上的网页的组织方式需要更多。给定的URL不会在任何地方列出值(使用Ctrl-U查看源代码),将/car-search
降级为use warnings;
use strict;
use feature 'say';
use WWW::Mechanize;
use open ':std', ':encoding(UTF-8)';
#my $url = 'https://www.autotrader.co.uk';
my $url = 'https://www.autotrader.co.uk/car-search';
my $mech = WWW::Mechanize->new( autocheck => 1 );
my $status = $mech->status( $mech->get($url) );
die "Got $status\n" if $status != 200;
$mech->form_number(2);
my @inputs = $mech -> find_all_inputs(
name_regex => qr/^(radius|make|model|price-to)$/,
type => 'option'
);
foreach my $input (@inputs) {
say "input: ", $input->name;
say join ' ', $input->possible_values;
say "\t$_" for $input->value_names;
}
。
当我们加载那个页面时,我们可以使用上面的讨论。以下代码旨在说明如何检索信息,请调整可维护性
radius
输出,为方便起见截断类别
input: radius 1500 1 5 10 15 20 25 30 35 40 45 50 55 60 70 80 90 100 200 Distance (national) Within 1 mile Within 5 miles ... input: price-to 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 5500 [...] (any) £500 (934) £1,000 (7,683) ...
此格式中只有price-to
和var getJSON = function(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'json';
xhr.onload = function() {
var status = xhr.status;
if (status === 200) {
callback(null, xhr.response);
} else {
callback(status, xhr.response);
}
};
xhr.send();
};
function statsget() {
var uname = document.getElementById("nameget").value;
var data = getJSON(`https://www.reddit.com/user/${uname}/circle.json`);
var stats = JSON.parse(data);
alert(data.is_betrayed);
}
。其他感兴趣的术语位于源代码下方的不同HTML元素中,必须以其他方式检索。