2017-11-22 11 views
0

私はスキルが不足しているので、私はPythonを再学習しようとしています。私は現在Pubmed APIを使っています。 hereというXMLファイルを解析して、各子( '/ pubmedarticle')を通過するループを実行し、いくつかの物を取得します。記事タイトルの場合は、 pubmedidのキー(pmid)。出力すなわちlxmlでPubmed API xmlを解析し、辞書に子をつけて

は、次のようになります。今、私はちょうど私が欲しいデータを取得するためにlxmlのパッケージを使用する方法を見つけ出すしたいため

{'29150897': {'title': 'Determining best outcomes from community-acquired pneumonia and how to achieve them.'} 
'29149862': {'title': 'Telemedicine as an effective intervention to improve antibiotic appropriateness prescription and to reduce costs in pediatrics.'}} 

後、私は、など、著者や雑誌などの複数の要因に追加されます辞書に入れる。私のためにこれを行うことができるたくさんのパッケージがあることは知っていますが、それは学習の目的を破るものです。私は別のものの束を試したし、これは私が現在何をしようとしているです:

from lxml import etree  
article_url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&tool=PMA&id=29150897,29149862" 
page = requests.get(article_url) 
tree = etree.fromstring(page.content) 

dict_out = {} 

for x in tree.xpath('//PubmedArticle'): 
    pmid = ''.join([x.text for x in x.xpath('//MedlineCitation/PMID[@Version="1"]')]) 
    title = ''.join([x.text for x in x.xpath('//ArticleTitle')]) 

    dict_out[pmid] = {'title': title} 

print(dict_out) 

誰でも洞察力を提供したり、私を導くことができる場合、私はおそらく、このプロセスについては移動する方法についての誤解がありますが、リソースの正しい方向に、それは非常に高く評価されるだろう。

編集:私の謝罪。私はこれよりもずっと速く書いた。私はすべての場合を修正しました。また、それはスロー結果はちょうど最初のタイトルを与えている間PMIDs組み合わせるようだ:

{'2725403628806902': {'title': 'Handshake Stewardship: A Highly Effective Rounding-based Antimicrobial Optimization Service.Monitoring, documenting and reporting the quality of antibiotic use in the Netherlands: a pilot study to establish a national antimicrobial stewardship registry.'}} 

Taのすべての

+1

問題は何ですか?コードによって何かが生成されますか?エラーはありますか? – mzjn

+0

'medlinecitation'は' MedlineCitation'でなければなりません。 'pmid'は' PMID'でなければなりません。等々。ケースは重要です! – mzjn

+0

ありがとうmzkn!私はうまくいけば読者のための質問を修正した。 –

答えて

2

code.py

import requests 
from lxml import etree 
from pprint import pprint as pp 

ARTICLE_URL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&tool=PMA&id=29150897,29149862" 


def main(): 
    response = requests.get(ARTICLE_URL) 
    tree = etree.fromstring(response.content) 
    ids = tree.xpath("//MedlineCitation/PMID[@Version='1']") 
    titles = tree.xpath("//Article/ArticleTitle") 
    if len(ids) != len(titles): 
     print("ID count doesn't match Title count...") 
     return 
    result = {_id.text: {"title": title.text} for _id, title in zip(ids, titles)} 
    pp(result) 


if __name__ == "__main__": 
    main() 

ノート

  • 私は
  • idsPMIDのリストを保持しているコードを少し構造化し、明確にするため、いくつかの変数に改名ノードであり、titlesは(対応する)ArticleTitleノード(パスに注意してください!所望の形式で一緒に参加する)
  • 方法は[Python]: PEP 274 -- Dict Comprehensionsを使用して、同時に2リスト上の反復のために、[Python]: zip((*iterables)ウィンにPython35を用い

出力を(使用しました。):

(py35x64_test) c:\Work\Dev\StackOverflow\q47433632>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py 
{'29149862': {'title': 'Telemedicine as an effective intervention to improve ' 
         'antibiotic appropriateness prescription and to reduce ' 
         'costs in pediatrics.'}, 
'29150897': {'title': 'Determining best outcomes from community-acquired ' 
         'pneumonia and how to achieve them.'}} 
0

まず、XMLはcase-sensitiveあり、そしてあなたは、XPathで小文字のタグを使用しています。

も、私はpmidは(数を表すまたは文字列)いくつかの数であるべきと考えている、とあなたのケースで、これは別の何かのようだ:

私のテストでは

`pmid = ''.join([x.text for x in x.xpath('//MedlineCitation/PMID[@Version="1"]')])` 

は、連結数字の文字列を生成し、それはあなたが探しているものではありません。

+0

実行していただきありがとうございます、私はケースを修正しました。あなたは正しいことが、その行が何をしているのか、それらをすべて一緒に押すだけです。私は、 'for'ループが各PubMedArticleノードを一度に取得するのではなく、各PubMedArticleノードを介して動作することを期待していました。私はそれらを繰り返し取得する方法がわかりません。 –

関連する問題