Come sapete sono alle prese con EPrints in merito ad un importante progetto dell’Università di Siena. Attualmente sto dedicando tanto tempo allo sviluppo di nuovi plugin e sistemi per importare metadati relativi alle pubblicazioni che i Ns docenti e ricercatori hanno in giro per il mondo di Internet, tra cui la banca dati dell’Associazione ESSPER. Come fare per importare i metadati presenti su questa banca dati ? Beh, non c’è il modo di esportare, come per altre, in formati standard quali BibTeX o MARC ma, solamente per chi è iscritto, si può esportare in RefWorks. Insomma, EPrintsamente parlando, un disastro :-D.
Nella pagina però noto una certa regolarità nella presentazione dei metadati, oltre alla possibilità di recuperare ciascun record direttamente dal parametro GET codice dell’URL, così decido di dare una sbirciata al sorgente html. Noto che non vi sono particolari difficoltà nella realizzazione di un semplice parser, basato sulle Regular Expressions, per catturare i metadati che ci interessano. Così decido di fare un tentativo e scrivo qualche riga di codice in Perl:
my $browser = LWP::UserAgent->new; my $url = "http://www.biblio.liuc.it/scripts/essper/ricerca.asp?tipo=scheda&codice=150406"; my $response = $browser->get( $url ); my $plain_text = HTML::FormatText->new(leftmargin => 0, rightmargin => 256)->format(parse_html($response->content)); my %fields = (); my @vars = split(/\n/,$plain_text); foreach (@vars) { my $line = $_; if($line =~ m/^\s*(Autori|Titolo|Periodico|Anno|Volume|Fascicolo|Pagina iniziale|Pagina finale|SICI):\s*(.*)\s*$/) { print "$1: $2\n"; $fields{$1} = $2; } }
Carramba…funziona ! Praticamente nessun magheggio strano: faccio un fetch dell’html della pagina, elimino tutti i tags ed il codice html (HTML::FormatText) ed eseguo una operazione di matching riga per riga usando le perl Re salvando i metadati e relativo valore dentro una lista hash.
Riesco pertanto ad estrarre i seguenti metadati:
- Titolo
- Autori
- Rivista
- Anno
- Pagina iniziale, pagina finale, volume, serie, fascicolo
- ISSN (direttamente dal SICI)
Interessante approfondire quest’ultimo punto sull’estrazione dell’ISSN. Il SICI contiene sia ISSN della rivista che altri dati univoci dell’articolo, organizzati in maniera univoca. Attraverso una espressione regolare riesco ad estrapolare l’ISSN:
my $sici = $fields{SICI};
if($sici =~ m/^(\d+)-(\d+).*\s*$/) {
print "ISSN: $1-$2\n";
}
A questo punto sviluppare un plugin di importazione per EPrints è un gioco da ragazzi: devo preoccparmi esclusivamente di fare l’override delle classi new, input_fh e convert_input, aggiungendo alcuni controlli per verificare che l’utente inserisca o l’URL completo (da cui poi estrapolo il numero del documento) o direttamente il numero:
if ($ids =~ /^http:.*/) {
my $query = CGI->new("$ids");
$ids = $query->param('codice');
}
if (!($ids =~ /^\d+/)) {
print "Invalid ID: $ids\n";
}
ed alla fine ecco a voi il Plugin di Import EssPer.pm pronto per essere copiato dentro /perl_lib/EPrints/Plugin/Import/ !