如何判断网页返回数据为二进制(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
相关产品推荐
相关产品推荐

