2017-08-11 6 views
1

J'essaie d'utiliser l'API MediaWiki pour obtenir toutes les redirections d'un certain titre de Wikipedia et je pense que je suis presque là mais je me perds dans la structure de données complexe des hachages et des tableaux.Comment puis-je extraire la liste des titres de redirection de MediaWiki :: API en Perl?

Comment puis-je extraire la liste des titres de redirection?

Dans l'exemple que je requête pour le Japon »et devrait obtenir une liste qui ressemble à ceci:

'JPN',"Land der aufgehenden Sonne","Das Land der aufgehenden 
Sonne","Zipango","\x{65e5}\x{672c}","R\x{ec}b\x{11b}n" 

(une question côté: Pourquoi ai-je pas UTF-8 chaînes pour tous les cas)

Le code ci-dessous est adapté de la documentation MediaWiki::API. Problème: comment obtenir les titres réels dans les redirect-array?

my $relinks = $alltitles->{'query'}->{'pages'}->{$pageid}->{'redirects'}; #no does not work! 

    foreach my $el (@{ $relinks->{'title'} }) { 
    print " $el $el->{'*'}\n"; 
    } 

Répondre

2

La requête renvoie un hashref. Une des entrées dans cette structure est query qui pointe vers un autre hashref qui contient pages. Le hashref pages contient des clés qui sont des identifiants de page. Chacun d'eux pointe vers un autre hashref qui contient une entrée de redirection qui est une référence à un tableau contenant toutes les pages vers lesquelles cette page redirige.

Mettre tous les ensemble:

#!/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 rend les choses un peu plus propre:

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)}; 
    } 
} 

Cela nécessite perl 5.20 ou plus tard.

+0

'$ r -> {redirections} -> @ *' Que se passe-t-il avec ça? Est-ce similaire à la version perl6 de '$ _'? Cela ne va-t-il pas exiger une version minimale spécifique de Perl? – jmcneirney