如何复制网页的文字内容
How to copy text content of a webpage
有天气数据的 ogimet 网页。我相信这些数据是免费使用的。网页提供了请求地表观测数据的脚本如下
curl "http://www.ogimet.com/cgi-bin/getsynop?block=123&begin=200912010000&end=200912040000" -o "your_desired_file_name"
我可以在我所在的地区使用这些数据。除此之外,我还想访问高空观测数据。没有提供用于访问此数据的脚本。它可以手动访问,例如对于一个站,具有以下 link
https://www.ogimet.com/display_sond.php?lang=en&lugar=63741&tipo=ALL&ord=DIR&nil=SI&fmt=html&ano=2021&mes=09&day=02&hora=19&anof=2021&mesf=09&dayf=03&horaf=19&send=send
这为我提供了截图中的文本内容 附图。
我想知道是否可以复制文本,一旦我到达此页面,使用,例如一个 Perl 脚本。不幸的是,我没有任何可以尝试的最低工作示例。
是的,您可以像那样从网页中收集(“抓取”)数据。这是一个粗略的路线图。
通常你会得到这个页面——从网络服务器检索一个带有该网页 HTML 的字符串——使用像这样的工具
LWP::UserAgent
要么
Mojo::UserAgent,
然后使用像这样的库解析 HTML 以提取感兴趣的数据
Mojo::DOM
要么
HTML::TreeBuilder
这里有很多关于使用这些工具(以及其他工具)的帖子。这是 Perl.com article.
中 Mojo::DOM
的舍入示例
如果该网页使用 JavaScript 来显示您感兴趣的数据,那就另当别论了。这意味着从服务器下载到您的浏览器的 HTML 还包含 JavaScript 代码——程序——可以直接在浏览器中 运行。当您单击(或悬停等)页面元素并重新处理页面时,它们会被触发,而无需返回服务器。
这是一个非常(过度)简化的解释,但重点是图书馆需要理解 JavaScript 才能将最后一页交给您进行解析,否则您只会得到 HTML 最后来自服务器。但是上面链接的主要图书馆不知道任何JavaScript;他们只是使用 HTTP 访问服务器,然后将服务器 returns.
交给你
对于理解 JavaScript 的工具,我推荐 Selenium
,用于测试网页但也非常适合这项工作,它本身是用 JavaScript 编写的。在 Perl 中使用它的一种方法是 Selenium::Chrome
(或 ::Firefox
)和 Selenium::Remote::Driver.
这是一个使用 Mojo::DOM
的例子:
use feature qw(say);
use strict;
use warnings;
use LWP::UserAgent;
use Mojo::DOM;
my $ua = LWP::UserAgent->new();
my $url = 'https://www.ogimet.com/display_sond.php?' .
'lang=en&lugar=63741&tipo=ALL&ord=DIR&nil=SI&fmt=html' .
'&ano=2021&mes=09&day=02&hora=19&anof=2021&mesf=09&dayf=03&horaf=19&send=send';
my $res = $ua->get( $url );
if (!$res->is_success) {
die $res->status_line;
}
my $html = $res->content;
my $dom = Mojo::DOM->new($html);
my @tables_raw_txt = $dom->find('table')->map('all_text')->each;
say $tables_raw_txt[1];
say "--------------- TABLE DATA --------------\n";
say $tables_raw_txt[2];
输出:
63741, Nairobi / Dagoretti (Kenya)
ICAO index: HKNC. Latitude 01-18S. Longitude 036-45E. Altitude 1798 m.
--------------- TABLE DATA --------------
TEMP/PILOT from 63741, Nairobi / Dagoretti (Kenya)
TTAA
02/09/2021 23:00->
TTAA 52231 63741 99822 14818 14003 70132 07008 20507 50584 03975
01508 40756 15970 09018 30967 31160 21008 25094 41557 23506
20241 53358 22511 15421 66958 14023 10658 76556 09013 88104
76957 13519 77999 31313 47708 82323=
TTBB
02/09/2021 23:00->
TTBB 52238 63741 00822 14818 11800 12407 22793 12006 33661 04001
44645 02800 55614 02009 66589 01445 77568 00717 88552 00960
99526 02366 11513 04160 22500 03975 33450 08773 44389 17571
55380 17978 66349 21969 77300 31160 88284 33964 99255 40360
11200 53358 22142 69558 33128 73757 44114 74556 55104 76957
21212 00822 14003 11569 31016 22522 01503 33398 09019 44359
08541 55277 24503 66211 25513 77134 12035 88108 15526 31313
47708 82323 41414 7543/=
TTCC
02/09/2021 23:00->
TTCC 52237 63741 70867 72760 32520 88999 77999 31313 47708 82323=
TTDD
02/09/2021 23:00->
TTDD 5223/ 63741 11877 74556 22831 68956 33700 72760 21212 11908
07010 22729 30529 33652 00000 44543 20020 31313 47708 82323=
OGIMET网站支持TXT格式的数据。这是提取所需数据的 regex 用法的问题。
如果Mojo::DOM
模块不可用,可以通过这种方式提取数据。
Perl 脚本使用散列 %params
表示 OP 问题中指定的位置和日期。通过添加模块 Getops::Long
每个参数都可以在命令行上单独调整。
注意:脚本接受一个参数station id
use strict;
use warnings;
use feature 'say';
use LWP::UserAgent;
my $station = shift;
my $url = 'https://www.ogimet.com/display_sond.php?';
my @params;
my %params = (
'lang' => 'en', // language
'lugar' => 63741, // station
'tipo' => 'ALL', // report type
'ord' => 'DIR', // sort order
'nil' => 'SI', // null report - SI (Yes)
'fmt' => 'txt', // format
'ano' => 2021, // year
'mes' => 9, // month
'day' => 2, // day
'hora' => 19, // hour
'anof' => 2021, // year
'mesf' => 9, // month
'dayf' => 3, // day
'horaf' => 19, // hour
'send' => 'send'
);
$params{lugar} = $station if defined $station;
while( my($k,$v) = each %params ) {
push @params, "$k=$v";
}
$url .= join('&',@params);
my $ua = LWP::UserAgent->new();
my $res = $ua->get( $url );
if (!$res->is_success) {
die $res->status_line;
}
my($data) = $res->content =~ m!<pre>(.*?)</pre>!gs;
say $data;
输出
##########################################################
# Query made at 09/04/2021 05:13:47 UTC
# Time interval: from 09/02/2021 19:00 to 09/03/2021 19:00 UTC
##########################################################
##########################################################
# 63741, Nairobi / Dagoretti (Kenya)
# IACO index: HKNC
# Latitude 01-18S. Longitude 036-45E. Altitude 1798 m.
##########################################################
##################################################
# TEMP/PILOT from 63741, Nairobi / Dagoretti (Kenya)
##################################################
202109022300 TTAA 52231 63741 99822 14818 14003 70132 07008 20507 50584 03975
01508 40756 15970 09018 30967 31160 21008 25094 41557 23506
20241 53358 22511 15421 66958 14023 10658 76556 09013 88104
76957 13519 77999 31313 47708 82323=
202109022300 TTBB 52238 63741 00822 14818 11800 12407 22793 12006 33661 04001
44645 02800 55614 02009 66589 01445 77568 00717 88552 00960
99526 02366 11513 04160 22500 03975 33450 08773 44389 17571
55380 17978 66349 21969 77300 31160 88284 33964 99255 40360
11200 53358 22142 69558 33128 73757 44114 74556 55104 76957
21212 00822 14003 11569 31016 22522 01503 33398 09019 44359
08541 55277 24503 66211 25513 77134 12035 88108 15526 31313
47708 82323 41414 7543/=
202109022300 TTCC 52237 63741 70867 72760 32520 88999 77999 31313 47708 82323=
202109022300 TTDD 5223/ 63741 11877 74556 22831 68956 33700 72760 21212 11908
07010 22729 30529 33652 00000 44543 20020 31313 47708 82323=
有天气数据的 ogimet 网页。我相信这些数据是免费使用的。网页提供了请求地表观测数据的脚本如下
curl "http://www.ogimet.com/cgi-bin/getsynop?block=123&begin=200912010000&end=200912040000" -o "your_desired_file_name"
我可以在我所在的地区使用这些数据。除此之外,我还想访问高空观测数据。没有提供用于访问此数据的脚本。它可以手动访问,例如对于一个站,具有以下 link
https://www.ogimet.com/display_sond.php?lang=en&lugar=63741&tipo=ALL&ord=DIR&nil=SI&fmt=html&ano=2021&mes=09&day=02&hora=19&anof=2021&mesf=09&dayf=03&horaf=19&send=send
这为我提供了截图中的文本内容
是的,您可以像那样从网页中收集(“抓取”)数据。这是一个粗略的路线图。
通常你会得到这个页面——从网络服务器检索一个带有该网页 HTML 的字符串——使用像这样的工具 LWP::UserAgent 要么 Mojo::UserAgent, 然后使用像这样的库解析 HTML 以提取感兴趣的数据 Mojo::DOM 要么 HTML::TreeBuilder
这里有很多关于使用这些工具(以及其他工具)的帖子。这是 Perl.com article.
中Mojo::DOM
的舍入示例
如果该网页使用 JavaScript 来显示您感兴趣的数据,那就另当别论了。这意味着从服务器下载到您的浏览器的 HTML 还包含 JavaScript 代码——程序——可以直接在浏览器中 运行。当您单击(或悬停等)页面元素并重新处理页面时,它们会被触发,而无需返回服务器。
这是一个非常(过度)简化的解释,但重点是图书馆需要理解 JavaScript 才能将最后一页交给您进行解析,否则您只会得到 HTML 最后来自服务器。但是上面链接的主要图书馆不知道任何JavaScript;他们只是使用 HTTP 访问服务器,然后将服务器 returns.
交给你对于理解 JavaScript 的工具,我推荐 Selenium
,用于测试网页但也非常适合这项工作,它本身是用 JavaScript 编写的。在 Perl 中使用它的一种方法是 Selenium::Chrome
(或 ::Firefox
)和 Selenium::Remote::Driver.
这是一个使用 Mojo::DOM
的例子:
use feature qw(say);
use strict;
use warnings;
use LWP::UserAgent;
use Mojo::DOM;
my $ua = LWP::UserAgent->new();
my $url = 'https://www.ogimet.com/display_sond.php?' .
'lang=en&lugar=63741&tipo=ALL&ord=DIR&nil=SI&fmt=html' .
'&ano=2021&mes=09&day=02&hora=19&anof=2021&mesf=09&dayf=03&horaf=19&send=send';
my $res = $ua->get( $url );
if (!$res->is_success) {
die $res->status_line;
}
my $html = $res->content;
my $dom = Mojo::DOM->new($html);
my @tables_raw_txt = $dom->find('table')->map('all_text')->each;
say $tables_raw_txt[1];
say "--------------- TABLE DATA --------------\n";
say $tables_raw_txt[2];
输出:
63741, Nairobi / Dagoretti (Kenya)
ICAO index: HKNC. Latitude 01-18S. Longitude 036-45E. Altitude 1798 m.
--------------- TABLE DATA --------------
TEMP/PILOT from 63741, Nairobi / Dagoretti (Kenya)
TTAA
02/09/2021 23:00->
TTAA 52231 63741 99822 14818 14003 70132 07008 20507 50584 03975
01508 40756 15970 09018 30967 31160 21008 25094 41557 23506
20241 53358 22511 15421 66958 14023 10658 76556 09013 88104
76957 13519 77999 31313 47708 82323=
TTBB
02/09/2021 23:00->
TTBB 52238 63741 00822 14818 11800 12407 22793 12006 33661 04001
44645 02800 55614 02009 66589 01445 77568 00717 88552 00960
99526 02366 11513 04160 22500 03975 33450 08773 44389 17571
55380 17978 66349 21969 77300 31160 88284 33964 99255 40360
11200 53358 22142 69558 33128 73757 44114 74556 55104 76957
21212 00822 14003 11569 31016 22522 01503 33398 09019 44359
08541 55277 24503 66211 25513 77134 12035 88108 15526 31313
47708 82323 41414 7543/=
TTCC
02/09/2021 23:00->
TTCC 52237 63741 70867 72760 32520 88999 77999 31313 47708 82323=
TTDD
02/09/2021 23:00->
TTDD 5223/ 63741 11877 74556 22831 68956 33700 72760 21212 11908
07010 22729 30529 33652 00000 44543 20020 31313 47708 82323=
OGIMET网站支持TXT格式的数据。这是提取所需数据的 regex 用法的问题。
如果Mojo::DOM
模块不可用,可以通过这种方式提取数据。
Perl 脚本使用散列 %params
表示 OP 问题中指定的位置和日期。通过添加模块 Getops::Long
每个参数都可以在命令行上单独调整。
注意:脚本接受一个参数station id
use strict;
use warnings;
use feature 'say';
use LWP::UserAgent;
my $station = shift;
my $url = 'https://www.ogimet.com/display_sond.php?';
my @params;
my %params = (
'lang' => 'en', // language
'lugar' => 63741, // station
'tipo' => 'ALL', // report type
'ord' => 'DIR', // sort order
'nil' => 'SI', // null report - SI (Yes)
'fmt' => 'txt', // format
'ano' => 2021, // year
'mes' => 9, // month
'day' => 2, // day
'hora' => 19, // hour
'anof' => 2021, // year
'mesf' => 9, // month
'dayf' => 3, // day
'horaf' => 19, // hour
'send' => 'send'
);
$params{lugar} = $station if defined $station;
while( my($k,$v) = each %params ) {
push @params, "$k=$v";
}
$url .= join('&',@params);
my $ua = LWP::UserAgent->new();
my $res = $ua->get( $url );
if (!$res->is_success) {
die $res->status_line;
}
my($data) = $res->content =~ m!<pre>(.*?)</pre>!gs;
say $data;
输出
##########################################################
# Query made at 09/04/2021 05:13:47 UTC
# Time interval: from 09/02/2021 19:00 to 09/03/2021 19:00 UTC
##########################################################
##########################################################
# 63741, Nairobi / Dagoretti (Kenya)
# IACO index: HKNC
# Latitude 01-18S. Longitude 036-45E. Altitude 1798 m.
##########################################################
##################################################
# TEMP/PILOT from 63741, Nairobi / Dagoretti (Kenya)
##################################################
202109022300 TTAA 52231 63741 99822 14818 14003 70132 07008 20507 50584 03975
01508 40756 15970 09018 30967 31160 21008 25094 41557 23506
20241 53358 22511 15421 66958 14023 10658 76556 09013 88104
76957 13519 77999 31313 47708 82323=
202109022300 TTBB 52238 63741 00822 14818 11800 12407 22793 12006 33661 04001
44645 02800 55614 02009 66589 01445 77568 00717 88552 00960
99526 02366 11513 04160 22500 03975 33450 08773 44389 17571
55380 17978 66349 21969 77300 31160 88284 33964 99255 40360
11200 53358 22142 69558 33128 73757 44114 74556 55104 76957
21212 00822 14003 11569 31016 22522 01503 33398 09019 44359
08541 55277 24503 66211 25513 77134 12035 88108 15526 31313
47708 82323 41414 7543/=
202109022300 TTCC 52237 63741 70867 72760 32520 88999 77999 31313 47708 82323=
202109022300 TTDD 5223/ 63741 11877 74556 22831 68956 33700 72760 21212 11908
07010 22729 30529 33652 00000 44543 20020 31313 47708 82323=