如何用Perl提取Autotrader网站searchVehicle表单的<option>字符串值?
提取Autotrader网站searchVehicle表单指定下拉列表的
嘿,我来帮你完善这段Perl代码,实现提取Autotrader网站指定下拉列表的
实现思路
- 先用
WWW::Mechanize加载目标页面,定位到searchVehicle表单 - 筛选出
name属性匹配正则qr/^(radius|make|model|price-to)/的下拉列表(<select>元素) - 对每个符合条件的
<select>,遍历其下的<option>元素,提取文本内容
完整代码实现
#!/usr/bin/perl use strict; use warnings; use utf8; use WWW::Mechanize; use HTML::TreeBuilder; use Data::Dumper; use JSON; binmode STDOUT, ':encoding(UTF-8)'; binmode STDIN, ':encoding(UTF-8)'; # 替换为实际的Autotrader目标URL my $url = 'https://www.autotrader.com/...'; my $mech = WWW::Mechanize->new( autocheck => 1, agent => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' ); # 加载目标页面 $mech->get($url); # 定位到searchVehicle表单,找不到则抛出错误 my $form = $mech->form_name('searchVehicle') or die "无法找到名称为searchVehicle的表单"; # 解析页面HTML内容 my $tree = HTML::TreeBuilder->new_from_content($mech->content); $tree->elementify; # 用于存储提取结果的哈希表,键是下拉列表name,值是对应<option>文本数组 my %select_options; # 遍历所有符合条件的<select>元素 foreach my $select ($tree->look_down( _tag => 'select', name => qr/^(radius|make|model|price-to)/ )) { my $select_name = $select->attr('name'); my @options; # 遍历当前<select>下的所有<option>元素 foreach my $option ($select->look_down(_tag => 'option')) { # 提取<option>的文本内容,去除首尾空白字符 my $opt_text = $option->as_text; $opt_text =~ s/^\s+|\s+$//g; # 跳过空文本的选项 push @options, $opt_text if $opt_text; } # 只有当有有效选项时才存入结果 $select_options{$select_name} = \@options if @options; } # 用Dumper打印结果,便于调试 print Dumper(\%select_options); # 也可以用JSON格式输出,更易读 # print to_json(\%select_options, {utf8 => 1, pretty => 1}); # 清理HTML TreeBuilder对象,避免内存泄漏 $tree->delete;
关键说明
- 依赖安装:需要额外安装
HTML::TreeBuilder模块,执行cpanm HTML::TreeBuilder即可完成安装 - 反爬优化:设置了真实的User-Agent,避免被网站识别为爬虫拦截
- 精准筛选:通过
look_down方法结合标签和正则匹配,精准定位目标下拉列表,不会误抓其他元素 - 文本处理:自动去除
内容的提问来源于stack exchange,提问作者tlre0952b
相关产品推荐
相关产品推荐

