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

7

我使用wget从互联网上读取页面。但有时我会得到经过gzip压缩的二进制流,而不是普通文本HTML文件。如何最好地确定所获取的数据是二进制还是纯文本?如果我尝试使用字母或数字(文本)匹配数据,那么就会得到“Malformed 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页面源代码?

谢谢。


抱歉,从网页接收到的数据应该放在文件$aPage中,而不是$result中。我之后使用slurp()读取文件$aPage,并尝试找出它是二进制还是文本。 - lisprogtor
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(任何二进制数据),而不是自动解码。但是,仍然需要在不是文本数据的情况下决定要做什么。

非常感谢Jonathan Worthington!我将安装Data::TextOrBinary模块和Cro::HTTP::Client模块,并尝试其他http模块。谢谢。 - lisprogtor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接