Python библиотека для поточного поиска тегов в XML, загружаемого по частям с веб-сайта

Библиотека HTTP-Stream-XML позволяет разработчикам анализировать XML загружаемый с веб-сайтов в потоковом режиме (Chunked transfer encoding). Вместо того чтобы ждать получения всего ответа, библиотека анализирует данные по мере их поступления, частями.

Эта стратегия приходится весьма кстати при работе с большими XML файлами, особенно теми, которые предоставляются медленными государственными сайтами.

Если ключевые теги данных расположены в начале XML-файла, HTTP-Stream-XML позволяет вам быстро их обнаружить, что существенно сокращает время ожидания.

Вместо того чтобы ждать, пока загрузится весь файл, вы можете быстро извлечь нужные вам данные уже из первых полученных частей файла.

Установка

pip install http-stream-xml

Пример использования HTTP-Stream-XML

Функция get_gene_info демонстрирует, как использовать библиотеку HTTP-Stream-XML для получения информации о гене из базы данных NCBI entrez API (PubMed), огромной базы данных биомедицинской информации.

"""Illustrates usage of streamed XML (partial) parsing.

Gets gene's info from NCBI entrez API (PubMed)
https://www.ncbi.nlm.nih.gov/
"""
from typing import Union

from http_stream_xml.entrez import requests_retry_session
from http_stream_xml.xml_stream import XmlStreamExtractor


def get_gene_info(gene_id: Union[str, int]) -> XmlStreamExtractor:
    """Get gene's info from NCBI entrez API (PubMed)."""
    extractor = XmlStreamExtractor(["Gene-ref_desc", "Entrezgene_summary", "Gene-ref_syn"])

    host = "eutils.ncbi.nlm.nih.gov"
    url = f"/entrez/eutils/efetch.fcgi?db=gene&id={gene_id}&retmode=xml"
    request = requests_retry_session().get(
        f"https://{host}{url}", stream=True, verify=False, timeout=60
    )

    fetched_bytes = 0
    for line in request.iter_lines(chunk_size=1024):
        if line:
            fetched_bytes += len(line)
            extractor.feed(line)
            if extractor.extraction_completed:
                break
        print(f"fetched {fetched_bytes} bytes, found tags {extractor.tags.keys()}")

    return extractor


if __name__ == "__main__":
    extractor = get_gene_info("5465")
    print(f"\nResult: {extractor.tags.keys()}\n\n{extractor.tags}")

Функция get_gene_info использует HTTP-Stream-XML для получения и анализа XML-ответа от NCBI API. Функция инициирует HTTP-запрос GET к API и стримит ответ. По мере поступления данных, XmlStreamExtractor начинает парсить его частями, прерываясь, как только завершается извлечение.

Этот подход значительно сокращает время ожидания, особенно когда критически важная часть XML-данных находится ближе к началу.

Заключение

Библиотека HTTP-Stream-XML для Python незаменима для извлечения данных при работе с большими XML-ответами от медленных серверов.

Она предлагает значительное преимущество в ситуациях, когда критические данные находятся в начале XML-файла, сокращая время ожидания для извлечения данных.

Исходный код

http-stream-xml