2008-10-22 22:06:25
Amazon S3にPDFファイルを保存して、検索対象情報はローカルホストのMySQLで管理する、論文管理システムをPythonで作ってみたのだが、どうも文字コード関連のエラーが多発して甚だ不便だという話は昨日までに報告したとおりである。ならば、PHPで作ってみようというわけである。
問題は論文からの情報抽出とMySQLへの情報追加、そしてpdfファイルのAmazon S3へのアップロードである。最後のアップロードはPHPでどうやったらいいか解らない。そこで、それだけは今までどおりPythonに頼むことにしよう。PHPではこんなふうにした。やっていることは、Pythonの場合と同じ。
<?php $con=mysql_connect("localhost","user","password"); mysql_select_db("paperdb",$con); $pmidarray = array(); foreach (glob("*.pdf") as $pdffile) { $pmid=ereg_replace("\.pdf","",$pdffile); $sql="select pmid from pdfdata where pmid = '".$pmid."'"; $res=mysql_query($sql); $num_row=mysql_num_rows($res); if ($num_row == 0){ array_push($pmidarray,$pmid); } } $ids = implode(",",$pmidarray); $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=".$ids."&retmode=xml&rettype=full"; $xml=simplexml_load_file($url); foreach($xml->PubmedArticle as $item){ $id = $item->MedlineCitation->PMID; $volume=$item->MedlineCitation->Article->Journal->JournalIssue->Volume; if (empty($volume)){ echo $id." This paper has not been published yet.\n"; break; } $year=$item->MedlineCitation->Article->Journal->JournalIssue->PubDate->Year; $title=$item->MedlineCitation->Article->ArticleTitle; $pages=$item->MedlineCitation->Article->Pagination->MedlinePgn; $abstract=$item->MedlineCitation->Article->Abstract->AbstractText; $abstract=mysql_escape_string($abstract); $aus=$item->MedlineCitation->Article->AuthorList->children(); $authors=""; foreach ($aus as $au){ $lastname=$au->LastName; $initials=$au->Initials; $authors=$authors.$lastname."_".$initials.", "; } $authors=ereg_replace(", $","",$authors); $authors=mysql_escape_string($authors); $journal=$item->MedlineCitation->MedlineJournalInfo->MedlineTA; $cmnd = "pdftotext -enc UTF-8 -nopgbrk ".$pmid.".pdf -"; $fulltext = mysql_escape_string(shell_exec($cmnd)); $insert="insert into pdfdata (pmid,authors,title,journal_title,journal_vol,Journal_pages,year,abstract,fullcontent) values('".$id."','".$authors."','".$title."','".$journal."','".$volume."','".$pages."','".$year."','".$abstract."','".$fulltext."')"; mysql_query($insert); echo $id."\n"; } mysql_close($con); passthru("python s3upload.py ".$ids); ?>
最後のs3upload.pyというのはこんなファイル。
#!/usr/bin/python # -*- coding: utf-8 -*- import os import sys from boto.s3.connection import S3Connection from boto.s3.key import Key ids = sys.argv[1] idlist = ids.split(',') s3conn = S3Connection() bucket = s3conn.get_bucket('pdffiles-pmid') bucket.set_acl('private') for id in idlist: filename = id + ".pdf" if bucket.lookup(filename) == None: k = Key(bucket) k.key = filename k.set_contents_from_filename(filename) # k.get_contents_to_filename("d" + filename)
PHPだと、pdftotextの出力も受け取りやすい。私は改めてPHPが好きになってきましたよ。