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

如何判断网页返回数据为二进制(gzip)或纯文本?求Raku相关工具

解决Raku中获取网页内容的gzip判断与自动解码问题

一、判断文件是gzip压缩流还是纯文本HTML

直接通过文件魔法数判断是最可靠的方式,可避免UTF-8解码错误:
gzip格式的文件开头两个固定字节是0x1F和0x8B,读取文件前2个字节即可比对:

sub is-gzip(Str $file) {
    my $fh = open $file, :bin;
    my $header = $fh.read(2);
    $fh.close;
    return $header eq Buf.new(0x1F, 0x8B);
}

# 使用示例
if is-gzip($aPage) {
    say "文件是gzip压缩格式";
    # 用Compress::Zlib模块解压
    use Compress::Zlib;
    my $uncompressed = Compress::Zlib::gunzip(slurp $aPage, :bin);
    my $html = $uncompressed.decode('UTF-8');
} else {
    say "文件是纯文本HTML";
    my $html = slurp $aPage;
}

另外,也可以直接让wget自动处理压缩:添加--decompress(或-d)参数后,wget会自动识别并解压gzip压缩的响应,直接输出纯文本HTML:

my $result = run << wget -k -q -O $aPage --decompress "$aURL" >>, :err;

二、推荐的Raku网页获取模块

无需依赖wget,直接用Raku原生模块即可自动处理编码和解压:

  • HTTP::UserAgent:基础HTTP客户端,自动处理Content-Encoding(包括gzip、deflate),直接返回解码后的文本:
use HTTP::UserAgent;

my $ua = HTTP::UserAgent.new;
my $response = $ua.get($aURL);

if $response.is-success {
    my $html = $response.content; # 自动解码后的纯文本HTML
    say $html;
} else {
    say "请求失败: " ~ $response.status-line;
}
  • WWW::Mechanize:基于HTTP::UserAgent的增强模块,支持会话管理、表单提交等功能,同样自动处理压缩和解码:
use WWW::Mechanize;

my $mech = WWW::Mechanize.new;
$mech.get($aURL);

if $mech.success {
    my $html = $mech.content;
    say $html;
} else {
    say "请求失败: " ~ $mech.response.status-line;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:24:27