Фильтрация / доступ к дате в Био Энтрезе опубликовал тяги с питоном
У меня есть список критериев (имена и диапазоны дат, когда статьи были опубликованы), чтобы получить список опубликованных работ. Я использую Bio Entthon Bio Entrez, чтобы получить документы от Entrez.
Я могу запрашивать и получать результаты по имени автора, но я не понимаю, как обращаться с данными, чтобы получить даты там. Вот что я сделал:
handle = Entrez.esearch(db="pubmed", term = "" )
result = Entrez.read(handle)
handle.close()
ids = result['IdList']
print ids
#for each ids go through it and pull the summary
for uid in ids:
handle2 = Entrez.esummary(db="pubmed", id=uid, retmode= "xml")
result2 = Entrez.read(handle2)
handle2.close()
Теперь вывод выглядит так
[{'DOI': '10.1016/j.jmoldx.2013.10.002', 'Title': 'Validation of a next-generation sequencing assay for clinical molecular oncology.', 'Source': 'J Mol Diagn', 'PmcRefCount': 7, 'Issue': '1', 'SO': '2014 Jan;16(1):89-105', 'ISSN': '1525-1578', 'Volume': '16', 'FullJournalName': 'The Journal of molecular diagnostics : JMD', 'RecordStatus': 'PubMed - indexed for MEDLINE', 'ESSN': '1943-7811', 'ELocationID': 'doi: 10.1016/j.jmoldx.2013.10.002', 'Pages': '89-105', 'PubStatus': 'ppublish+epublish', 'AuthorList': ['Cottrell CE', 'Al-Kateb H', 'Bredemeyer AJ', 'Duncavage EJ', 'Spencer DH', 'Abel HJ', 'Lockwood CM', 'Hagemann IS', "O'Guin SM", 'Burcea LC', 'Sawyer CS', 'Oschwald DM', 'Stratman JL', 'Sher DA', 'Johnson MR', 'Brown JT', 'Cliften PF', 'George B', 'McIntosh LD', 'Shrivastava S', 'Nguyen TT', 'Payton JE', 'Watson MA', 'Crosby SD', 'Head RD', 'Mitra RD', 'Nagarajan R', 'Kulkarni S', 'Seibert K', 'Virgin HW 4th', 'Milbrandt J', 'Pfeifer JD'], 'EPubDate': '2013 Nov 6', 'PubDate': '2014 Jan', 'NlmUniqueID': '100893612', 'LastAuthor': 'Pfeifer JD', 'ArticleIds': {'pii': 'S1525-1578(13)00219-5', 'medline': [], 'pubmed': ['24211365'], 'eid': '24211365', 'rid': '24211365', 'doi': '10.1016/j.jmoldx.2013.10.002'}, u'Item': [], 'History': {'received': '2013/02/04 00:00', 'medline': ['2014/08/30 06:00'], 'revised': '2013/08/23 00:00', 'pubmed': ['2013/11/12 06:00'], 'aheadofprint': '2013/11/06 00:00', 'accepted': '2013/10/01 00:00', 'entrez': '2013/11/12 06:00'}, 'LangList': ['English'], 'HasAbstract': 1, 'References': ['J Mol Diagn. 2014 Jan;16(1):7-10. PMID: 24269227'], 'PubTypeList': ['Journal Article'], u'Id': '24211365'}]
Я попытался посмотреть на использование Efetch, который не всегда выводит xml из того, что я понимаю. Я думал, что я мог бы фильтровать даты, анализируя XML как так
proj_start = '2009 Jan 01'
proj_start = time.strptime(proj_start, '%Y %b %d')
for paper in results2:
handle = open(paper)
record = Entrez.read(handle)
pub_dat=time.strptime(record["EPubDate"], '%Y %b %d')
Я получаю сообщение об ошибке: Traceback (последний вызов был последним):
File "<ipython-input-39-13bcded12392>", line 2, in <module>
handle = open(paper)
TypeError: coercing to Unicode: need string or buffer, ListElement found
Я чувствую, что что-то упустил, и я должен быть в состоянии вставить это непосредственно в запрос. Я также не понимаю, почему этот метод не работает, хотя это кажется более сложным способом сделать это. Есть лучший способ сделать это? Я пытался сделать это с помощью xml.etree, но я также получил похожую ошибку.
1 ответ
Вам не нужно open(paper)
: paper
это уже Python dict
(в основном JSON). Если вы хотите принять принятую дату, вы можете получить к ней доступ следующим образом:
paper['History']['accepted']
'2013/10/01 00:00'