Perl中HTML::TableExtract无法识别Pro Football Reference页面所有表格
解决HTML::TableExtract无法识别Pro Football Reference中注释表格的问题
问题原因
Pro Football Reference页面里的多数数据表格(包括你需要的「冲球与接球」表格)被包裹在HTML注释<!-- ... -->中,用于实现页面的显示/隐藏切换功能。而HTML::TableExtract默认会忽略注释内的HTML内容,所以你的脚本只能识别到页面中未被注释的4个表格。
解决方案
你需要先预处理下载的HTML内容,移除包裹目标表格的注释标签,或者直接提取注释内的表格代码,再交给HTML::TableExtract解析。以下是两种可行的实现方式:
方式1:全局移除HTML注释(简单直接)
修改下载后的HTML字符串,去掉所有<!--和-->标签,让模块能识别到所有表格:
use strict; use warnings; use HTML::TableExtract; use LWP::Simple; my $team = 'rav'; my $url = 'https://www.pro-football-reference.com/teams/' . $team . '/2024.htm'; print " Processing $url\n\n"; my $download = get $url; # 移除所有HTML注释 $download =~ s/<!--(.|\n)*?-->//g; my $te = HTML::TableExtract->new(); $te->parse($download); # 遍历所有表格,找到目标表格 foreach my $ts ($te->tables) { my $caption = $ts->caption; if ($caption && $caption =~ /Rushing & Receiving/) { print "找到目标表格:$caption\n"; print "表头:", join(',', @{$ts->rows->[0]}), "\n"; # 输出前5行数据示例 for my $i (1..5) { last if $i >= scalar @{$ts->rows}; print "数据行$i:", join(',', @{$ts->rows->[$i]}), "\n"; } } }
方式2:精准提取目标表格(性能更优)
如果只想处理目标表格,可通过正则表达式直接提取包含id="rushing_and_receiving"的表格代码,避免全局修改HTML:
use strict; use warnings; use HTML::TableExtract; use LWP::Simple; my $team = 'rav'; my $url = 'https://www.pro-football-reference.com/teams/' . $team . '/2024.htm'; print " Processing $url\n\n"; my $download = get $url; # 提取目标表格的HTML代码 if ($download =~ /<table[^>]*id="rushing_and_receiving"[^>]*>(.*?)<\/table>/s) { my $target_table_html = $1; # 补全<table>标签确保解析正常 $target_table_html = "<table id='rushing_and_receiving'>$target_table_html</table>"; my $te = HTML::TableExtract->new(); $te->parse($target_table_html); # 输出表格内容 my ($ts) = $te->tables; if ($ts) { print "目标表格表头:", join(',', @{$ts->rows->[0]}), "\n"; for my $row (@{$ts->rows}[1..$#{$ts->rows}]) { # 跳过空行或汇总行(可根据实际需求调整) next unless $row->[0] && $row->[0] !~ /Total/; print join(',', @$row), "\n"; } } } else { print "未找到目标表格\n"; }
额外提示
- 开启
use warnings可以帮助排查脚本中的潜在问题,建议不要注释掉。 - HTML::TableExtract支持通过表格的ID、类名或标题精准定位,比如初始化时可以指定:
但前提是该表格的HTML代码未被注释,所以还是需要先处理注释问题。my $te = HTML::TableExtract->new( attribs => { id => 'rushing_and_receiving' } );
内容的提问来源于stack exchange,提问作者JimZipCode
相关产品推荐
相关产品推荐

