You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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、类名或标题精准定位,比如初始化时可以指定:
    my $te = HTML::TableExtract->new( attribs => { id => 'rushing_and_receiving' } );
    
    但前提是该表格的HTML代码未被注释,所以还是需要先处理注释问题。

内容的提问来源于stack exchange,提问作者JimZipCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:05:04