Раскрыть все вкладки на сайте, ICD-10

Здравствуйте. Есть у меня вот такой сайт https://icd.who.int/browse10/2019/en

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

Только вот вопрос: Как можно раскрыть все вкладки автоматом?? Штатно такую функцию не предусмотрели.

Видимо потому что каждое открытие это запрос типа ...JsonGetChildrenConcepts?ConceptId=II&useHtml=true&showAdoptedChildren=true
Так что надо получить все номера и делать запросы.

Тут попроще можно.
В консоли пишу

document.querySelectorAll('.ygtvrow')

Он показывает все строки с текстом.
Подскажите как теперь пробежать по всем элементам и вернуть innerText.
Тут Select не нахожу.

Или может можно както так написать?

document.querySelectorAll('.ygtvrow > innerText')

не … дичь какая то … (((
Сделал вот такую хрень:

var t = Array.from(document.querySelectorAll('.ygtvitem'))
	for (let cnt = 0; cnt < 5; cnt++){
		t = Array.from(document.querySelectorAll('.ygtvitem'))
		for (let index = 0; index < t.length; index++) {
			t[index].querySelectorAll(".ygtvcell.ygtvtp").forEach(s=>s.click());
		}
	}

Вроде бы работает но открывает почему то не больше 2 - 3 вкладок …

А толку? Блок с подкатегориями (.ygtvchildren) пуст пока не сделан запрос.

Кстати, а нужны же все уровни? Их там много )

image

Так вот именно что нужна вся база со всеми внутренностями.

Нашел вот еще такой момент.

	for (let index = 2; index < 5; index++) {
			OBrowserNavigation.getInstance().theHierarchy.tree._nodes[index].toggle();
			sleep(1000);
		}

toggle если вызывать для каждого узла то он его раскрывает. Но одним запросом в цикле нифига не работает. Может можно как то асинхронно запускать??

Может оно где-то доступно в другом виде?
Чот не нашел нигде в норм виде для машин, но например Free 2022 ICD-10-CM Codes выглядит проще, ходить рекурсивно по a.identifier

Мне бы просто выгрузить в список именно английскую версию… далее то я все равно буду переделывать под нужный формат.

А по ссылке я получаю " 403 Forbidden"

впн наверно нужен.

Вроде как есть API API Documentation (version 2.x) - ICD-API Homepage

Или тут чей-то дамп JSON Dump of ICD 10 Codes & Desc · GitHub

Это к какому ресурсу то?? К тому что вы скинули? " Free 2022 ICD-10-CM Codes"

к icd.who.int

Чет какие то заморочки с получением ключа авторизации.
Вообще странно что такие проблемы с получением полной версии на английском. Русские версии прям сразу в любом виде находятся. Неужели это прям такая секретная информация чтоли …

Так может проще все-таки слать самому запросы и разбирать ответы? Сначала https://icd.who.int/browse10/2019/en/JsonGetRootConcepts?useHtml=true, затем https://icd.who.int/browse10/2019/en/JsonGetChildrenConcepts?ConceptId=I&useHtml=true&showAdoptedChildren=true (как уже указал @AlexP), перебирая все ID из ответа, у которых isLeaf равен false.

Даже Cat API требует ключ ))

Ну ключ вроде как дают просто после регистрации бесплатно, только OAuth осложняет, но для всех языков есть библиотеки стандартные или сторонние, и там даже есть пример C# ICD API Authentication - ICD-API Homepage

Сложнее понять дает ли API возможность выгрузить всё, возможно он для другого.
Но думаю можно как минимум выполнять GET ​/icd​/entity​/{id} рекурсивно начиная с корневых.

Еще его вроде бы можно установить локально, может там есть какой-то файл БД Installing ICD-API as a Windows Service - ICD-API Homepage
Ну и как вариант можно просто использовать эту локальную штуку, не надо будет потом думать как обновить данные.

ТАм 70 тыщ записей … времени уйдет тьма.

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

Нашел тут от от 14 года файлы csv … осталось только свести их в одну для локализации и будет маленький csv.

Вообще думал что такие вещи всегда в свободном доступе …

Так вот же более свежий json

из txt отсюда https://www.cms.gov/Medicare/Coding/ICD10/2018-ICD-10-CM-and-GEMs, 2018 Code Descriptions in Tabular Order (ZIP)

Но вроде бы тут без дерева только код и описание.

Вот такая питоновская лапша:

import requests
from datetime import datetime
import time

requests_count = 0
url_globals = {"null": None, "false": False, "true": True}
default_sleep_time = 5
sleep_time = default_sleep_time
err_msg = "You do not have permission to view this directory or page."

def my_requests_get(url):
    global requests_count
    requests_count += 1
    print(requests_count, url)

    try:
        r = requests.get(url)
        return r.text
    except requests.Timeout as err:
        print(err.message)
        return err_msg

def add_children(icd_list):
    for elem in icd_list:
        if elem['isLeaf']:
            continue
        while True:
            text = my_requests_get('https://icd.who.int/browse10/2019/en/JsonGetChildrenConcepts?ConceptId=%s&useHtml=true&showAdoptedChildren=true' % elem['ID'])
            if err_msg in text:
                print("Sleeping %d seconds" % sleep_time)
                time.sleep(sleep_time)
                sleep_time *= 2
            else:
                sleep_time = default_sleep_time
                break
        resp_list = eval(text, url_globals)
        elem["children"] = resp_list
        add_children(resp_list)

start_time = datetime.now().time()
print(start_time)

text = my_requests_get('https://icd.who.int/browse10/2019/en/JsonGetRootConcepts?useHtml=true')
resp_list = eval(text, url_globals)
add_children(resp_list)

with open('icd_result.txt', 'w') as f:
    f.write("%s" % resp_list)

print(requests_count, start_time, datetime.now().time())

Отработала за 10 минут и 1929 запросов (были повторы запросов, так как сайту парсинг не понравился :slight_smile: ). Всего в результирующем файле 12597 записей получилось.
icd_result.txt (3.9 МБ)
Остается только пройтись по результату и преобразовать в желаемый вид (например, подсчет записей):

def add_count(l):
    global id_count
    for elem in l:
        if "children" in elem:
            id_count += len(elem["children"])
            add_count(elem["children"])

with open('icd_result.txt', 'r') as f:
    resp_list = eval(f.read())

id_count = len(resp_list)
add_count(resp_list)

print(id_count)
2 лайка

огонь … )))

А функция “eval” как выглядит?? чего то не вижу в коде.

Ну с английским разобрались. Но потом нужно каким то образом с русской свести. А русского апи тут нету.

Так то я вчера уже нарыл какие то базы и свел в нужную таблицу. Но теперь просто интересно если вдруг найдется русский апи к этому ресурсу то это будет супер решение. ))

А вот нашел. Русскую csv можно скачать отсюда https://mkb10.su/download.html и потом взяв коды запросить их с английской апи. И будет то что надо. )))

она в коде языка )