Автоматизация efetch не возвращает XML-файл

Ключевые слова: Entrez NCBI PubMed Python3.7 BeautifulSoup xml

Я хотел бы получить некоторые XML-данные из списка идентификаторов Pubmed. Когда я использую URL-адрес, указанный в качестве примера на веб-сайте Entrez (https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=10890170&retmode=xml) данные правильно загружаются в виде файла xml. , но если мне нужно автоматизировать поиск, заменив идентификатор переменной (temp_id), возвращается текст, а не файл xml.

Поэтому я получаю эту ошибку (потому что нет файла xml с тегами xml)

Traceback (последний вызов последним): файл "test.py", строка 14, в pub_doi = soup.find (idtype = "doi"). Text AttributeError: объект 'NoneType' не имеет атрибута 'text'

from bs4 import BeautifulSoup
import certifi
import urllib3
temp_id=str(10890170)
#efetch_url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=10890170&retmode=xml'#this url works

base_url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/'
efetch_url = '%sefetch.fcgi?db=pubmed&id=%s&retmode=xml' % (base_url, temp_id)
try:
    http = urllib3.PoolManager()
    http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
    url = efetch_url
    results = http.request('GET', url)
    soup = BeautifulSoup(results.data,features='xml')
    pub_doi = soup.find(idtype="doi").text
    pub_abstract = soup.pubmedarticleset.pubmedarticle.article.abstract.abstracttext.text
except (urllib3.exceptions.HTTPError, IOError) as e:
    print("ERROR!", e)
else:
    pass

По какой-то причине, когда я копирую и вставляю URL-адрес в моем браузере, он отображается как текст в Safari и xml в Chrome.

Я хотел бы получить некоторую помощь, так как подозреваю, что мой URL-адрес неправильно построен.


person Maad scientist    schedule 30.03.2019    source источник
comment
Вам нужно использовать 'lxml' вместо 'xml' в soup = BeautifulSoup(results.data,features='xml'), это заставит вашу вторую строку (pub_abstract = soup.pubmedarticleset.pubmedarticle и т. Д.) Работать. Ваша первая строка, вероятно, не работает, потому что ваш XML-файл не содержит ничего с IdType="doi", вы хотели сделать idtype="pubmed" или idtype="pii"?   -  person Boris    schedule 31.03.2019
comment
Спасибо, что заметили это, но это не решает проблему. дело в том, что если нет xml файла, pub_doi работать не будет. Обратите внимание, однако, что URL-адрес NCBI Entrez, представленный в качестве примера, работает с моим кодом.   -  person Maad scientist    schedule 01.04.2019
comment
как указано выше, XML не содержит IdType = doi. Таким образом, вы, по сути, пытаетесь вытащить текст для чего-то, чего не существует, поэтому ошибка 'NoneType' object has no attribute 'text'   -  person chitown88    schedule 01.04.2019
comment
Привет, Читтаун, спасибо за ответ, но я не думаю, что вы понимаете мою проблему.   -  person Maad scientist    schedule 02.04.2019
comment
По какой-то причине, когда я копирую и вставляю URL-адрес в моем браузере, он отображается как текст в Safari и xml в Chrome.   -  person Maad scientist    schedule 02.04.2019


Ответы (1)


Оказывается, проблема заключалась в том, как Beautiful Soup обрабатывал URL-ссылку. Вместо этого я использовал ElementTree, и это сработало.

person Maad scientist    schedule 24.04.2019