【问题标题】:How do I pull HTML form option values?如何提取 HTML 表单选项值?
【发布时间】:2018-04-10 03:16:22
【问题描述】:

Autotrader 的网站有一个名为“searchVehicle”的表单。在该表单中是给定表单输入字段qr/^(radius|make|model|price-to) 的许多HTML 值。这些值如您所料,即下拉列表。如何提取那些<option> 的字符串值?

到目前为止,我有以下 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' 值?

【问题讨论】:

  • 能否提供实际页面的网址?
  • @zdim - 我已经编辑了代码。

标签: perl


【解决方案1】:

WWW::Mechanize::find_all_inputs 的文档说

find_all_inputs() 返回当前表单中所有输入控件的数组,其属性与传入的所有正则表达式匹配。返回的控件全部来自 HTML::Form::Input。详情请见"INPUTS" in HTML::Form

所以你的@inputsHTML::Form 对象的数组。

从给定的链接到其INPUTS 部分,我们可以找到namevaluevalue_names 等方法。这是您用来提取所需信息的工具。

所提供的实际网站的更新

但是,此站点上的页面的组织方式需要更多。给定的 URL 没有在任何地方列出值(使用 Ctrl-U 查看源代码),将 action 降级为 /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;
}

输出,为方便起见截断了类别

输入:半径 1500 1 5 10 15 20 25 30 35 40 45 50 55 60 70 80 90 100 200 距离(全国) 1英里以内 5英里以内 ... 输入:按价格计算 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 5500 [...] (任何) 500 英镑 (934) 1,000 英镑 (7,683) ...

只有radiusprice-to 是这种形式。其他感兴趣的术语位于源代码下方的不同 HTML 元素中,必须以其他方式检索。

【讨论】:

  • @uncle-junky 谢谢,我刚刚看了,可以使用答案中的方法查询表单的所有组件。那你想做什么?大概现在你会填写并提交表格等。你想要什么“价值”——你能举个例子吗?
  • 如何访问 radius|make|model|price-to 的值?
  • 我想你可能误解了。在我的代码中,我返回了一个哈希数组。如果我遍历 @inputs 数组并仅打印当前循环的哈希键,我可以访问 Dumper 输出中列出的所有值,但我在 <option> 标记的值之后。例如,在网站searchVehicles 表单中有一个用于距离的输入字段。下拉菜单为您提供 1 到 200 英里之间的选择。我如何获得这些值?
  • 我已取消删除帖子。
  • @uncle-junky 好的,恢复了。注意:我对异想天开的 -1 反应不佳,我打算将其删除,除非分数发生变化。所以请使用它,当你完成时让我知道。有问题请告诉我。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2020-06-29
  • 2016-08-12
  • 2011-05-06
  • 2013-11-23
相关资源
最近更新 更多