处理从网络读取的二进制流

lis*_*tor 7 html binary raku

我使用 wget 从网络上读取页面。但有时我会得到 gzipped 二进制流而不是纯文本 html 文件。确定我获得的数据是二进制还是纯文本的最佳方法是什么?如果我尝试将数据与字母或数字(文本)匹配,我只会得到“格式错误的 UTF-8”。

my $result = run << wget -k -q -O $aPage "$aURL" >>, :err; 
Run Code Online (Sandbox Code Playgroud)

我需要知道 $result 是二进制(gzip)还是纯文本。

if $result ~~ / <:L + :N> / { } # this will fail with "Malformed UTF-8" if $result is a binary stream
Run Code Online (Sandbox Code Playgroud)

是否有 Raku 包可以从任何 url 获取纯文本 html 页面源?

Jon*_*ton 7

确定我获得的数据是二进制还是纯文本的最佳方法是什么?

也许最普遍的答案可能是转向 Raku 模块Data::TextOrBinary,它可用于确定某些数据是否可能是文本或二进制;这是一种启发式方法。

确定 HTTP 响应性质的最佳方法是查看标Content-type头。不要调用wget,而是尝试各种 Raku HTTP 模块之一,该模块可以通过zef包管理器安装。例如,您可以使用Cro::HTTP::Client

use Cro::HTTP::Client;
my $response = await $aURL;
say "Content is " ~ $response.content-type;
my $body = await $response.body;
say $body ~~ Blob ?? "It's binary!" !! "It's not binary!";
Run Code Online (Sandbox Code Playgroud)

如果我尝试将数据与字母或数字(文本)匹配,我只会得到“格式错误的 UTF-8”。

默认情况下run假设这就是它将得到的。您还可以将:bin参数传递给run, 以获得Blob(任何二进制数据),而不是让它自动解码。但是,您仍然需要决定如果不是文本数据该怎么办。