如何在 Perl 中从 MediaWiki::API 中提取重定向标题列表?
How can I extract the list of redirect titles from MediaWiki::API in Perl?
我正在尝试使用 MediaWiki API 从某个维基百科标题获取所有重定向,我想我快到了,但我迷失在散列和数组的复杂数据结构中。
如何提取重定向标题列表?
在示例中,我查询了 'Japan' 并且应该得到如下所示的列表:
'JPN',"Land der aufgehenden Sonne","Das Land der aufgehenden
Sonne","Zipango","\x{65e5}\x{672c}","R\x{ec}b\x{11b}n"
(附带问题:为什么我不能在所有情况下都获得 UTF-8 字符串?)
以下代码改编自 MediaWiki::API 文档。
use MediaWiki::API;
use warnings;
binmode STDOUT, ':utf8';
use JSON;
use Data::Dumper;
my $LANG="de";
my $mw = MediaWiki::API->new( { api_url => 'https://en.wikipedia.org/w/api.php' } );
my $mw_LANG = MediaWiki::API->new( { api_url => "https://$LANG.wikipedia.org/w/api.php" } );
my $wikititle ="Japan";
my $alltitles = $mw_LANG->api( {
action => 'query',
titles => $wikititle,
prop => 'redirects',
format => 'json',
} )
|| die $mw_LANG->{error}->{code} . ': ' . $mw_LANG->{error}->{details};
#just print to know how the structure looks like
print Dumper($alltitles);
my ($pageid,$langlinks) = each ( %{ $alltitles->{query}->{pages} } );
print "pageid $pageid\n";#yes works: this prints the page id
问题:如何获取 redirect-array
中的实际标题?
my $relinks = $alltitles->{'query'}->{'pages'}->{$pageid}->{'redirects'}; #no does not work!
foreach my $el ( @{ $relinks->{'title'} } ) {
print " $el $el->{'*'}\n";
}
查询returns一个hashref。此结构中的条目之一是 query
,它指向另一个包含 pages
的 hashref。 pages
hashref 包含作为页面 ID 的键。这些中的每一个都指向另一个包含重定向条目的 hashref,该条目是对包含此页面重定向到的所有页面的数组的引用。
将所有这些放在一起:
#!/usr/bin/env perl
use strict;
use warnings;
use open qw(:std :utf8);
use MediaWiki::API;
use JSON::MaybeXS;
use Data::Dumper;
my $LANG= "de";
my $mw = MediaWiki::API->new( { api_url => 'https://en.wikipedia.org/w/api.php' } );
my $mw_LANG = MediaWiki::API->new( { api_url => "https://$LANG.wikipedia.org/w/api.php" } );
my $wikititle ="Japan";
my $alltitles = $mw_LANG->api( {
action => 'query',
titles => $wikititle,
prop => 'redirects',
format => 'json',
}
) or die sprintf '%d: %s', @{ $mw_LANG->{error} }{qw(code details)};
for my $pageid ( keys %{ $alltitles->{query}{pages} } ) {
my $r = $alltitles->{query}{pages}{$pageid};
printf "Redirects for page %d with title '%s'\n", @{$r}{qw(pageid title)};
for my $redirect ( @{ $r->{redirects} }) {
printf "\t%d: '%s'\n", @{$redirect}{qw(pageid title)};
}
}
Postfix dereferencing 让事情变得更简洁:
for my $pageid ( keys $alltitles->{query}{pages}->%* ) {
my $r = $alltitles->{query}{pages}{$pageid};
printf "Redirects for page %d with title '%s'\n", $r->@{qw(pageid title)};
for my $redirect ( $r->{redirects}->@* ) {
printf "\t%d: '%s'\n", $redirect->@{qw(pageid title)};
}
}
这需要 perl
5.20 或更高版本。
我正在尝试使用 MediaWiki API 从某个维基百科标题获取所有重定向,我想我快到了,但我迷失在散列和数组的复杂数据结构中。
如何提取重定向标题列表?
在示例中,我查询了 'Japan' 并且应该得到如下所示的列表:
'JPN',"Land der aufgehenden Sonne","Das Land der aufgehenden
Sonne","Zipango","\x{65e5}\x{672c}","R\x{ec}b\x{11b}n"
(附带问题:为什么我不能在所有情况下都获得 UTF-8 字符串?)
以下代码改编自 MediaWiki::API 文档。
use MediaWiki::API;
use warnings;
binmode STDOUT, ':utf8';
use JSON;
use Data::Dumper;
my $LANG="de";
my $mw = MediaWiki::API->new( { api_url => 'https://en.wikipedia.org/w/api.php' } );
my $mw_LANG = MediaWiki::API->new( { api_url => "https://$LANG.wikipedia.org/w/api.php" } );
my $wikititle ="Japan";
my $alltitles = $mw_LANG->api( {
action => 'query',
titles => $wikititle,
prop => 'redirects',
format => 'json',
} )
|| die $mw_LANG->{error}->{code} . ': ' . $mw_LANG->{error}->{details};
#just print to know how the structure looks like
print Dumper($alltitles);
my ($pageid,$langlinks) = each ( %{ $alltitles->{query}->{pages} } );
print "pageid $pageid\n";#yes works: this prints the page id
问题:如何获取 redirect-array
中的实际标题?
my $relinks = $alltitles->{'query'}->{'pages'}->{$pageid}->{'redirects'}; #no does not work!
foreach my $el ( @{ $relinks->{'title'} } ) {
print " $el $el->{'*'}\n";
}
查询returns一个hashref。此结构中的条目之一是 query
,它指向另一个包含 pages
的 hashref。 pages
hashref 包含作为页面 ID 的键。这些中的每一个都指向另一个包含重定向条目的 hashref,该条目是对包含此页面重定向到的所有页面的数组的引用。
将所有这些放在一起:
#!/usr/bin/env perl
use strict;
use warnings;
use open qw(:std :utf8);
use MediaWiki::API;
use JSON::MaybeXS;
use Data::Dumper;
my $LANG= "de";
my $mw = MediaWiki::API->new( { api_url => 'https://en.wikipedia.org/w/api.php' } );
my $mw_LANG = MediaWiki::API->new( { api_url => "https://$LANG.wikipedia.org/w/api.php" } );
my $wikititle ="Japan";
my $alltitles = $mw_LANG->api( {
action => 'query',
titles => $wikititle,
prop => 'redirects',
format => 'json',
}
) or die sprintf '%d: %s', @{ $mw_LANG->{error} }{qw(code details)};
for my $pageid ( keys %{ $alltitles->{query}{pages} } ) {
my $r = $alltitles->{query}{pages}{$pageid};
printf "Redirects for page %d with title '%s'\n", @{$r}{qw(pageid title)};
for my $redirect ( @{ $r->{redirects} }) {
printf "\t%d: '%s'\n", @{$redirect}{qw(pageid title)};
}
}
Postfix dereferencing 让事情变得更简洁:
for my $pageid ( keys $alltitles->{query}{pages}->%* ) {
my $r = $alltitles->{query}{pages}{$pageid};
printf "Redirects for page %d with title '%s'\n", $r->@{qw(pageid title)};
for my $redirect ( $r->{redirects}->@* ) {
printf "\t%d: '%s'\n", $redirect->@{qw(pageid title)};
}
}
这需要 perl
5.20 或更高版本。