2017-11-22 8 views
0

저는 재사용을 시도하여 기술이 부족합니다. 나는 현재 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.'}} 

따 모두의

+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() 

참고 : 나는 조금의 코드를 구조화하고 명확

  • ids에 대한 몇 가지 변수를 이름

    사용 하였다 원하는 형식으로 함께 가입하도록) :

    (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 = ''.join([x.text for x in x.xpath('//MedlineCitation/PMID[@Version="1"]')])` 
    

    연결된 숫자의 문자열을 생산에서

    :

    또한 내가 pmid 일부 번호 (또는 문자열을 나타내는 수)해야 믿고, 귀하의 경우이 뭔가 다른 것 같다 그것은 당신이 찾고있는 것이 아닙니다.

    +0

    실행 해 주셔서 사례를 수정했습니다. 당신은 맞습니다. 그 라인이하고있는 것입니다. 나는 'for'루프가 각 '// PubMedArticle'노드를 한꺼번에 잡는 대신 작동 할 수 있기를 바랬다. 나는 그것들을 반복적으로 얻는 방법을 모른다. –