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

问题描述 投票:0回答:1

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

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

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

if $result ~~ / <:L + :N> / { } # this will fail with "Malformed UTF-8" if $result is a binary stream

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

html binary raku
1个回答
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!";

如果我尝试将数据与字母或数字(文本)进行匹配,我只会得到“Malformed UTF-8”。

默认情况下

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

© www.soinside.com 2019 - 2024. All rights reserved.