如何提取HTML表单选项值?

时间:2018-04-03 03:37:45

标签: perl

Autotrader的网站上有一个名为&#39; searchVehicle&#39;的表格。在该表单中,给定表单输入字段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'值?

1 个答案:

答案 0 :(得分:3)

WWW::Mechanize::find_all_inputs的文档说

  

find_all_inputs()返回当前表单中所有输入控件的数组,其中的属性与传入的所有正则表达式匹配。返回的控件都来自HTML :: Form :: Input。有关详细信息,请参阅"INPUTS" in HTML::Form

因此,您的INPUTSHTML::Form个对象的数组。

从给定的链接到name部分,我们找到了valuevalue_namesaction等许多方法。这是您用来提取所需信息的内容。

提供的实际网站的更新

但是,此网站上的网页的组织方式需要更多。给定的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-tovar 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元素中,必须以其他方式检索。