Полагаю, он не может найти нужную таблицу?
Кажется, это так, да. Если вы проверите значение table
, вы увидите, что это None
, и поэтому вызов find_all
для него не работает.
Если вы проверите таблицу на странице, вы посмотрите, что его классы - wikitable collapsible collapsed mw-collapsible mw-made-collapsible
, а класса sortable
там нет. Вот почему ваша программа не находит ни одного подходящего элемента table
.
На этой странице довольно много таблиц, так как мне правильно указать на эту таблицу?
Во-первых, вы можете подключиться к какому-нибудь уникальному идентификатору, например к id
элемента, но в вашем случае его нет. Если бы у него был thead
или какой-то заголовок, вы могли бы попробовать с этим, но опять же, это не тот случай.
Затем вам нужно go дальше вверх по дереву DOM, и проверьте его родителей, есть ли у них какие-либо уникальные идентификаторы. По плану вы добавляете родителя в селектор. К сожалению, основная часть статей Википедии, кажется, заключена в один большой элемент без семантического разделения разделов. Это затрудняет очистку.
На этом этапе я бы сказал, что вам остается просто смотреть на страницу браузера и думать о том, как вы могли бы естественным образом идентифицировать таблицу (непрограммно). Вы смотрите на него и видите, что в заголовке указано Расовый состав . И вы можете получить его с помощью чего-то вроде
table_heading = soup.find('th', text='Racial composition') # this gives you the `th`
if table_heading:
table = table_heading.find_parents('table')
Могут быть некоторые другие beautifulsoup
API, которых я не знаю, но вы можете добавить это в свой код, и он должен работать.