Как извлечь информацию из части XML на примере NCBI (PubMed) Entrez API

Проблема NCBI Entrez

Мне было необходимо извлечь общую информацию о гене из публичной БД NCBI.

К сожалению, их Entrez API на нужный мне запрос возвращает много ненужной мне информации - мегабатйты.

Таким образом возникла задача получить только общее описание гена из начала возвращаемого API XML, не загружая его полностью.

В Python для xml.sax можно зарегистрировать обработчик, который будет получать уже извлеченные из документа тэги на лету, еще в процессе разбора XML:

parser = xml.sax.make_parser()
parser.setContentHandler(your_stream_handler)

Детальный пример использования такого обработчика можно увидеть в xml_stream.py

Также есть возможность передавать в xml.sax документ XML кусочек за кусочком:

parser = xml.sax.make_parser()
parser.feed(chunk)

Прекрасно, с парсингом частичного XML мы разобрались.

Что насчет частичной загрузки ответа с сервера? Самый простой случай если сервер поддерживает выдачу ответа частями.

Но это не обязательное условие - мы можем просто прервать загрузку, как только мы получим нужную нам часть. Например requests поддерживает поточную загрузку:

import requests

r = requests.get('https://httpbin.org/stream/20', stream=True)
for line in r.iter_lines():
    print(line)

Теперь вы готовы написать весь код.

Как пример вы можете посмотреть на http-stream-xml. Задачу получения общего описания генов из NCBI Entrez можно решить с его помощью в две строки:

from httpstreamxml import entrez

print(entrez.genes['myo5b'][entrez.GeneFields.description])
Опубликовано July 5, 2019