Так что есть много способов пройтись по дереву DOM, и ваш путь очень «хрупок».Это означает, что выбранные вами селекторы, с которых нужно начать поиск, чрезвычайно специфичны и привязаны к стилю CSS, который может измениться намного проще, чем структура документа в целом.
Но на вашем месте я бы фильтровалвниз по некоторым узлам по некоторым критериям, а затем сосредоточьтесь на этой конкретной группе, пока вы просеиваете шум.
Итак, глядя на те URL, которые вы показали, кажется, что данные структурированы аккуратно и с использованием таблиц.Исходя из этого, мы можем сделать некоторые предположения, такие как
- Это данные, которые находятся внутри таблицы
- В ней будет содержаться строка "главного исследователя"
# get all the tables in the page
tables = soup.find_all('table')
# now filter down to a smaller set of tables that might contain the info
refined_tables = [table for table in tables if 'principal investigator' in str(table).lower()]
На данный момент у нас есть сильный кандидат в нашем списке refined_tables
, который на самом деле может содержать нашу первичную таблицу и в идеале имеет размер 1, если предположить, что фильтр «основного исследователя», который мы использовали, больше нигде в других таблицах.
principal_investigator = [ele for ele in refined_tables.findAll('td') if 'name' in ele.attrs['headers']][0].text
Именно здесь при просмотре сайта было использовано то, что они использовали атрибут headers
для назначения роли тега td
в строке таблицы.
Так что, по сути, просто подумайте об этом с верхнего уровня и начните сужать вещи как можно проще, используя простые шаги, чтобы помочь вам найти то, что вы ищете.