【问题标题】:How do I download txt web content using perl如何使用 perl 下载 txt 网页内容
【发布时间】:2020-06-12 23:18:30
【问题描述】:

我正在尝试从此data page 下载数据。我已经尝试了一些我用谷歌搜索的脚本。在数据页面上,我必须选择我想要的国家,一次一个。一个接近我想要的脚本是:

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;

my $url = 'https://www.ogimet.com/ultimos_synops2.php?lang=en&estado=Zamb&fmt=txt&Send=Send';
my $file = 'Zamb.txt';
getstore($url, $file);

但是,这个脚本给了我页面,而不是数据。如果可能的话,如果我能获得下载数据的帮助,我将不胜感激。 如果这可能是一个更简单的选择,我也会很感激在 php 中执行此操作。

【问题讨论】:

  • 你的“数据”是什么?
  • 在页面上,可以选择所需数据的国家和时间。一旦选择了这些,就会有一个发送按钮打开一个数据页面。数据为 ascii(文本)格式。我希望这能澄清问题。
  • 如果响应内容已经是数据,问题出在哪里?
  • 也许我没有提供更精确的信息。在页面上,除了选择国家和时间之外,我只想要最新(或特定时间)的概要和元消息,在几种可用的消息类型中。现在得到的是一个没有数据的html格式的文档。
  • GET -o text 'https://www.ogimet.com/ultimos_synops2.php?lang=en&estado=Spa&fmt=txt&Send=Send' 或后处理以剥离不在<pre> / </pre> 之间的所有内容

标签: php perl


【解决方案1】:

链接返回用 HTML 包裹的文本。最简单的方法是使用 HTML::FormatText 和 HTML::Parse 来获取纯文本版本。

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TreeBuilder;
use HTML::FormatText;


my $url = 'https://www.ogimet.com/ultimos_synops2.php?lang=en&estado=Zamb&fmt=txt&Send=Send';
my $text = HTML::FormatText->new(leftmargin=>0, rightmargin=>100000000000)->format(HTML::TreeBuilder->new_from_url($url));

my $file = 'Zamb.txt';
open (my $fh, '>', $file);
print $fh $text;
close ($fh);

这是Zamb.txt之后的内容。

 $ cat Zamb.txt
##########################################################
# Query made at 02/29/2020 18:15:54 UTC
##########################################################

##########################################################
# latest SYNOP reports from Zambia before 02/29/2020 18:15:54 UTC
##########################################################
202002291200 AAXX 29124 67855 42775 51401 10310 20168 3//// 48/// 85201
                   333 5//// 85850 83080=

我的php fu不是最新的,但是对于PHP,我认为你可以使用以下:

<?php
$url = 'https://www.ogimet.com/ultimos_synops2.php?lang=en&estado=Zamb&fmt=txt&Send=Send';
$content = strip_tags(file_get_contents($url));
echo substr($content, strpos($content, '###############'));

注意:我似乎记得有一些配置选项可能会禁用通过 file_get_contents 获取 URL 所以 YMMV。

但是,同一页有一个注释:

注意:如果您想获得简单的带有 CSV 格式的概要报告而不带 HTML 标记的文件,请考虑使用二进制的 getsynop

这将以易于使用的格式为您提供相同的数据:

$ wget "https://www.ogimet.com/cgi-bin/getsynop?begin=$(date +%Y%m%d0000)&state=Zambia" -o /dev/null -O - | tail -1
67855,2020,02,29,12,00,AAXX 29124 67855 42775 51401 10310 20168 3//// 48/// 85201 333 5//// 85850 83080=

【讨论】:

  • 非常感谢@Sorin。这在 perl 中完全解决了我的问题。 php 代码在我的 ubuntu 上出现错误。但是,我非常感谢您的时间和精力。只是为了好奇,我可以写一个脚本来下载 wget 正如你所指出的。输出文件名是什么?以及发送到 /dev/null 的内容是什么?
  • @ZiloreMumba 你得到什么错误? -O - 将输出发送到标准输入,因此您可以通过 tail -1 获取最后一行。 -o /dev/null 将 wget 日志发送到 dev null
  • 您在上面给出的脚本可以正常工作。我只是想知道如何使用您建议的 wget 命令。在 perl 脚本中,它给出了错误“在 Synops_ogm0.pl 第 15 行,“wget”ogimet.com/cgi-bin/getsynop?begin=$(date +%Y%m%d0000)&state=Zambia 附近的操作员预期的位置找到字符串“”(你需要预先声明 wget 吗?) ”。在终端上(即在脚本之外),它给出了一个长文件名,名称中包含部分 url,没有有意义的内容。
  • gnu.org/software/wget/manual/wget.html - 这是一个外部命令 - 在 perl 脚本中,您可以使用 LWP 获取相同的 url,但您还需要拆分它并仅获取最后一行。
猜你喜欢
  • 2018-01-15
  • 2015-03-23
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2016-08-23
相关资源
最近更新 更多