Как извлечь информацию из части 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])