2007-10-10 21:42:34
これまでBibTeX形式の引用文献データを作るときには、Biorubyの使用例として紹介されているスクリプトを使ってきたのだが、昨日はどういうわけか結果が返ってこなかった。どうしてだろう。Google Scholarでも検索結果をBibTeX形式で表示させる機能があるのだが、コピー&ペーストが面倒臭い気分のときもある。Biorubyスクリプト不調の原因を解明するよりも自分で作った方がいいかなと思い、しかしRubyはまだよく使えないのでPHPで作ってみた(以下のPHPスクリプトで\\は本来改行していない行を改行していることを示している)。
#!/usr/bin/php
<?php
$pmid = $argv[1];
$url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?";
$url .= "db=pubmed&id=".$argv[1]."&retmode=xml";
$res = file_get_contents($url);
$xml = simplexml_load_string($res);
foreach($xml as $item){
$pmid = $item->MedlineCitation->PMID;
$type = $item->MedlineCitation->Article->PublicationTypeList-\\
>PublicationType[0];
if($type=="Journal Article"){
$ttype = "article";
}else{
$ttype = "other";
}
$title = $item->MedlineCitation->Article->ArticleTitle;
$authors = $item->MedlineCitation->Article->AuthorList->\\
Author;
$authorarray = array();
foreach($authors as $author){
array_push($authorarray,($author->LastName.", ".$author\\
->Initials));
}
$authorlist = implode(" and ",$authorarray);
$journal = $item->MedlineCitation->Article->Journal->Title;
$volume = $item->MedlineCitation->Article->Journal->\\
JournalIssue->Volume;
$number = $item->MedlineCitation->Article->Journal->\\
JournalIssue->Issue;
$pages = $item->MedlineCitation->Article->Pagination->\\
MedlinePgn;
$year = $item->MedlineCitation->Article->Journal->\\
JournalIssue->PubDate->Year;
$tlwords = explode(" ",$title);
$thrlett = strtolower(substr($tlwords[0],0,1).substr\\
($tlwords[1],0,1).substr($tlwords[2],0,1));
$cite = strtolower($authors[0]->LastName).$year.$thrlett;
$pp = explode("-",$pages);
$len0 = strlen($pp[0]);
$len1 = strlen($pp[1]);
$pp1 = substr($pp[0],0,($len0-$len1));
$ppages = $pp[0]."--".$pp1.$pp[1];
echo "@".$ttype."{".$cite.",\n";
echo " title={".$title."},\n";
echo " author={".$authorlist."},\n";
echo " journal={".$journal."},\n";
echo " volume={".$volume."},\n";
echo " number={".$number."},\n";
echo " pages={".$ppages."},\n";
echo " year={".$year."}\n";
echo "}\n\n";
}
?>
このスクリプトをpmfetch.phpなど好きな名前で保存して(実行権を与えて)、% ./pmfetch.php 16709590,15908380,15845368というように引用したい論文のPubMed IDを引数に実行するとBibTeX形式で結果が返ってくるはず(複数の論文の情報を得たいときは「,」でつなぐ)。引用用のIDはGoogle Scholarふうの作り方にしてみた。Google Scholarではなぜかタイトルが二重の{}で囲まれているけれども、ここではそんなことはしていない。ページ数を全部表示させるのに余計な手間がかかってしまった。ファイルに保存したいときは、「>>ファイル名」などとしてみる。ちなみに、キーワードで検索する機能はない。