Алла Тамбовцева, НИУ ВШЭ
requests
и BeautifulSoup
¶Наша задача: выгрузить информацию о депутатах в датафрейм pandas, чтобы потом сохранить все в csv-файл.
Сначала сгрузим весь html-код страницы и сохраним его в отдельную переменную. Для этого нам понадобится библиотека requests.
import requests
Сохраним ссылку в переменную url
для удобства и выгрузим страницу. (Разумеется, это будет работать при подключении к интернету. Если соединение будет отключено, Python выдаст NewConnectionError).
url = "http://www.tulaoblduma.ru/sostav_i_struktura/deputaty_tod/"
page = requests.get(url)
Если мы просто посмотрим на объект, мы ничего особенного не увидим:
page
<Response [200]>
Поэтому импортируем BeautifulSoup и скормим одноименной функции страницу в виде текста:
from bs4 import BeautifulSoup
text = page.text
soup = BeautifulSoup(text, "lxml")
Если выведем soup
на экран, мы увидим то же самое, что в режиме разработчика или в режиме происмотра исходного кода (view-source
через Ctrl+U).
soup
Для просмотра выглядит не очень удобно. "Причешем" наш soup
‒ воспользуемся методом .prettify()
в сочетании с функцией print()
.
print(soup.prettify())
В такой выдаче ориентироваться гораздо удобнее (но при желании, то же можно увидеть в браузере, на большом экране).
Теперь вернемся к нашей задаче. Видно, что информация о депутатах представлена в таблице. Следовательно, поиск нужно производить по тэгу <table>
. Воспользуемся методом .find_all()
:
soup.find_all('table')
Метод .find_all
возращает список с кусками html-кода, которые соответствуют указанному тэгу.
И тут мы сталкиваемся с проблемой. Несмотря на то, что визуально кажется, что таблица одна, на странице их несколько (меню сверху, содержание снизу и прочее). Найдем длину полученного выше списка:
len(soup.find_all('table')) # целых пять таблиц
5
Если мы посмотрим на исходный код страницы и посчитаем тэги <table>
, мы обнаружим, что нужная нам таблица третья, то есть с индексом 2.
soup.find_all('table')[2]
<table class="deputats" width="100%"> <tbody> <thead><tr> <td align="center" valign="center" width="5%"><b>Фото</b></td> <td align="center" valign="center" width="20%"><b>ФИО</b></td> <td align="center" valign="center" width="25%"><b>Фракция</b></td> <td align="center" valign="center" width="25%"><b>Комитет</b></td> <td align="center" valign="center" width="25%"><b>Комиссия</b></td> </tr></thead> <tr> <td width="5%"><a href="deputat_info.php?117692"><img alt="" border="0" height="67" src="/upload/iblock/5a3/abakumov1.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117692">Абакумов Владимир Евгеньевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#8285">Комитет по строительству, жилищно-коммунальному и дорожному хозяйству </a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117732"><img alt="" border="0" height="67" src="/upload/iblock/26e/aleshina.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117732">Алёшина Галина Ивановна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#174">Комиссия по регламенту и депутатской этике</a><br/>Член комиссии</td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117693"><img alt="" border="0" height="67" src="/upload/iblock/b38/Alhovik.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117693">Альховик Алексей Иванович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117729"><img alt="" border="0" height="67" src="/upload/iblock/e38/Artemjev.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117729">Артемьев Сергей Александрович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117694"><img alt="" border="0" height="67" src="/upload/iblock/269/Atanov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117694">Атанов Егор Васильевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117727"><img alt="" border="0" height="67" src="/upload/iblock/b93/balberov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117727">Балберов Александр Александрович</a></td> <td valign="top" width="25%">Фракция «ЛДПР»<br/>Руководитель фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151"></a><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117695"><img alt="" border="0" height="67" src="/upload/iblock/37a/Belov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117695">Белов Сергей Александрович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#150">Комитет по государственному строительству, безопасности и местному самоуправлению</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?2931"><img alt="" border="0" height="67" src="/upload/iblock/c94/Bychkov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?2931">Бычков Денис Владимирович</a></td> <td valign="top" width="25%"><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117696"><img alt="" border="0" height="67" src="/upload/iblock/4ed/vorobjev.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117696">Воробьев Николай Юрьевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117726"><img alt="" border="0" height="67" src="/upload/iblock/cba/vystavkin.jpeg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117726">Выставкин Михаил Борисович</a></td> <td valign="top" width="25%">Фракция «ЛДПР»<br/>Заместитель руководителя фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Председатель комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117697"><img alt="" border="0" height="67" src="/upload/iblock/99f/gryazev2.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117697">Грязев Михаил Васильевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#8285">Комитет по строительству, жилищно-коммунальному и дорожному хозяйству </a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117728"><img alt="" border="0" height="67" src="/upload/iblock/466/ermakovas1.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117728">Ермаков Александр Сергеевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?118913"><img alt="" border="0" height="67" src="/upload/iblock/66c/Zayceva.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?118913">Зайцева Ольга Сергеевна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Председатель комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117737"><img alt="" border="0" height="67" src="/upload/iblock/3e9/zaletin1.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117737">Залетин Сергей Викторович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#150">Комитет по государственному строительству, безопасности и местному самоуправлению</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117698"><img alt="" border="0" height="67" src="/upload/iblock/8fd/ivancov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117698">Иванцов Михаил Евгеньевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117734"><img alt="" border="0" height="67" src="/upload/iblock/f2b/Kirjanova.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117734">Кирьянова Елена Сергеевна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#8285">Комитет по строительству, жилищно-коммунальному и дорожному хозяйству </a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#174">Комиссия по регламенту и депутатской этике</a><br/>Член комиссии</td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117699"><img alt="" border="0" height="67" src="/upload/iblock/23d/Kondrashov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117699">Кондрашов Юрий Викторович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?118914"><img alt="" border="0" height="67" src="/upload/iblock/0d8/Kotik.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?118914">Котик Людмила Ивановна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117723"><img alt="" border="0" height="67" src="/upload/iblock/165/Lebedev.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117723">Лебедев Алексей Александрович</a></td> <td valign="top" width="25%">Фракция «КПРФ»<br/>Руководитель фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151"></a><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117742"><img alt="" border="0" height="67" src="/upload/iblock/eb3/makarovec.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117742">Макаровец Николай Александрович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117738"><img alt="" border="0" height="67" src="/upload/iblock/293/Malazonia.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117738">Малазония Надежда Николаевна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117725"><img alt="" border="0" height="67" src="/upload/iblock/acd/3x4_112x150.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117725">Марьясова Юлия Александровна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Руководитель фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151"></a><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117731"><img alt="" border="0" height="67" src="/upload/iblock/909/moiseev.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117731">Моисеев Юрий Фясыхович</a></td> <td valign="top" width="25%">Фракция «КПРФ»<br/>Заместитель руководителя фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#174">Комиссия по регламенту и депутатской этике</a><br/>Член комиссии</td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117724"><img alt="" border="0" height="67" src="/upload/iblock/89a/Moscalec.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117724">Москалец Александр Петрович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151"></a><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#174">Комиссия по регламенту и депутатской этике</a><br/>Руководитель комиссии</td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117735"><img alt="" border="0" height="67" src="/upload/iblock/464/Nikolaeva.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117735">Николаева Наталия Вячеславовна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117700"><img alt="" border="0" height="67" src="/upload/iblock/5b4/Nuzhdihin.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117700">Нуждихин Григорий Вячеславович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#150">Комитет по государственному строительству, безопасности и местному самоуправлению</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?133117"><img alt="" border="0" height="67" src="/upload/iblock/a5c/Panin1.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?133117">Панин Владимир Алексеевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?131799"><img alt="" border="0" height="67" src="/upload/iblock/29a/Paramonova.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?131799">Парамонова Ольга Владимировна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#150">Комитет по государственному строительству, безопасности и местному самоуправлению</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117701"><img alt="" border="0" height="67" src="/upload/iblock/ae4/popov_s.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117701">Попов Николай Кузьмич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117702"><img alt="" border="0" height="64" src="/upload/iblock/95b/rem.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117702">Рем Александр Викторович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#148">Комитет по экономической политике и финансам</a><br/>Председатель комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117703"><img alt="" border="0" height="67" src="/upload/iblock/ac4/samoshin_A_A.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117703">Самошин Андрей Анатольевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#149">Комитет по вопросам собственности и земельным отношениям</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117740"><img alt="" border="0" height="67" src="/upload/iblock/603/simonov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117740">Симонов Александр Федорович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117704"><img alt="" border="0" height="67" src="/upload/iblock/9f9/Sljusareva.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117704">Слюсарева Ольга Анатольевна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#8285">Комитет по строительству, жилищно-коммунальному и дорожному хозяйству </a><br/>Председатель комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117705"><img alt="" border="0" height="67" src="/upload/iblock/64d/Sudarikov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117705">Судариков Анатолий Павлович</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#8285">Комитет по строительству, жилищно-коммунальному и дорожному хозяйству </a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117706"><img alt="" border="0" height="67" src="/upload/iblock/084/Tesov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117706">Тесов Михаил Николаевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#150">Комитет по государственному строительству, безопасности и местному самоуправлению</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117707"><img alt="" border="0" height="67" src="/upload/iblock/c2d/Tolstaja.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117707">Толстая Екатерина Александровна</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151">Комитет по социальной политике</a><br/>Член комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#174">Комиссия по регламенту и депутатской этике</a><br/>Член комиссии</td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117708"><img alt="" border="0" height="67" src="/upload/iblock/652/trifonov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117708">Трифонов Виктор Александрович</a></td> <td valign="top" width="25%"><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#150">Комитет по государственному строительству, безопасности и местному самоуправлению</a><br/>Председатель комитета</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> <tr> <td width="5%"><a href="deputat_info.php?117709"><img alt="" border="0" height="69" src="/upload/iblock/0b4/haritonov.jpg" width="50"/></a></td> <td valign="top" width="20%"><a href="deputat_info.php?117709">Харитонов Сергей Алексеевич</a></td> <td valign="top" width="25%">Фракция «Единая Россия»<br/>Член фракции</td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#151"></a><br/> </td> <td valign="top" width="25%"><a href="/sostav_i_struktura/sostav_komitetov_i_komissiy/index.php#"></a><br/></td> </tr> </tbody> </table>
Обязательно ли считать таблицы вручную? Зависит от страницы. Давайте посмотрим внимательнее на атрибуты объектов типа table
в html-коде и проверим, можно ли поступить проще. Если сравнивать кусочки кода для разных таблиц, видно, что у таблицы с депутатами есть отличительная черта ‒ класс deputats
:
Этой особенностью можно было воспользоваться ‒ указать атрибут в виде словаря:
soup.find_all('table', {"class": "deputats"})
И считать ничего не пришлось! Сохраним результат и будем двигаться дальше.
table = soup.find_all('table', {"class": "deputats"})[0] # 0 - индекс единственного элемента в списке выше
Таблицу нашли, теперь из нее нужно извлечь имена депутатов и их партийную принадлежность. Сначала разберемся с именами. По коду видно, что и имена, и партии, и комитеты с комиссиями заключены в тэги <td>
. Можно ли найти какую-то зацепку, чтобы ловить имена? Да! Посмотрите внимательно на атрибут valign
. У ячеек с ФИО он равен "top"
. Этим-то мы и воспользуемся.
for t in table.find_all('td', valign = "top"):
print(t.text)
Абакумов Владимир Евгеньевич Фракция «Единая Россия»Член фракции Комитет по строительству, жилищно-коммунальному и дорожному хозяйству Член комитета Алёшина Галина Ивановна Фракция «Единая Россия»Член фракции Комитет по социальной политикеЧлен комитета Комиссия по регламенту и депутатской этикеЧлен комиссии Альховик Алексей Иванович Фракция «Единая Россия»Член фракции Комитет по социальной политикеЧлен комитета Артемьев Сергей Александрович Фракция «Единая Россия»Член фракции Комитет по вопросам собственности и земельным отношениямЧлен комитета Атанов Егор Васильевич Фракция «Единая Россия»Член фракции Комитет по вопросам собственности и земельным отношениямЧлен комитета Балберов Александр Александрович Фракция «ЛДПР»Руководитель фракции Белов Сергей Александрович Фракция «Единая Россия»Член фракции Комитет по государственному строительству, безопасности и местному самоуправлениюЧлен комитета Бычков Денис Владимирович Комитет по вопросам собственности и земельным отношениямЧлен комитета Воробьев Николай Юрьевич Фракция «Единая Россия»Член фракции Комитет по экономической политике и финансамЧлен комитета Выставкин Михаил Борисович Фракция «ЛДПР»Заместитель руководителя фракции Комитет по вопросам собственности и земельным отношениямПредседатель комитета Грязев Михаил Васильевич Фракция «Единая Россия»Член фракции Комитет по строительству, жилищно-коммунальному и дорожному хозяйству Член комитета Ермаков Александр Сергеевич Фракция «Единая Россия»Член фракции Комитет по экономической политике и финансамЧлен комитета Зайцева Ольга Сергеевна Фракция «Единая Россия»Член фракции Комитет по социальной политикеПредседатель комитета Залетин Сергей Викторович Фракция «Единая Россия»Член фракции Комитет по государственному строительству, безопасности и местному самоуправлениюЧлен комитета Иванцов Михаил Евгеньевич Фракция «Единая Россия»Член фракции Комитет по вопросам собственности и земельным отношениямЧлен комитета Кирьянова Елена Сергеевна Фракция «Единая Россия»Член фракции Комитет по строительству, жилищно-коммунальному и дорожному хозяйству Член комитета Комиссия по регламенту и депутатской этикеЧлен комиссии Кондрашов Юрий Викторович Фракция «Единая Россия»Член фракции Комитет по вопросам собственности и земельным отношениямЧлен комитета Котик Людмила Ивановна Фракция «Единая Россия»Член фракции Комитет по социальной политикеЧлен комитета Лебедев Алексей Александрович Фракция «КПРФ»Руководитель фракции Макаровец Николай Александрович Фракция «Единая Россия»Член фракции Комитет по вопросам собственности и земельным отношениямЧлен комитета Малазония Надежда Николаевна Фракция «Единая Россия»Член фракции Комитет по социальной политикеЧлен комитета Марьясова Юлия Александровна Фракция «Единая Россия»Руководитель фракции Моисеев Юрий Фясыхович Фракция «КПРФ»Заместитель руководителя фракции Комитет по экономической политике и финансамЧлен комитета Комиссия по регламенту и депутатской этикеЧлен комиссии Москалец Александр Петрович Фракция «Единая Россия»Член фракции Комиссия по регламенту и депутатской этикеРуководитель комиссии Николаева Наталия Вячеславовна Фракция «Единая Россия»Член фракции Комитет по экономической политике и финансамЧлен комитета Нуждихин Григорий Вячеславович Фракция «Единая Россия»Член фракции Комитет по государственному строительству, безопасности и местному самоуправлениюЧлен комитета Панин Владимир Алексеевич Фракция «Единая Россия»Член фракции Комитет по экономической политике и финансамЧлен комитета Парамонова Ольга Владимировна Фракция «Единая Россия»Член фракции Комитет по государственному строительству, безопасности и местному самоуправлениюЧлен комитета Попов Николай Кузьмич Фракция «Единая Россия»Член фракции Комитет по экономической политике и финансамЧлен комитета Рем Александр Викторович Фракция «Единая Россия»Член фракции Комитет по экономической политике и финансамПредседатель комитета Самошин Андрей Анатольевич Фракция «Единая Россия»Член фракции Комитет по вопросам собственности и земельным отношениямЧлен комитета Симонов Александр Федорович Фракция «Единая Россия»Член фракции Комитет по социальной политикеЧлен комитета Слюсарева Ольга Анатольевна Фракция «Единая Россия»Член фракции Комитет по строительству, жилищно-коммунальному и дорожному хозяйству Председатель комитета Судариков Анатолий Павлович Фракция «Единая Россия»Член фракции Комитет по строительству, жилищно-коммунальному и дорожному хозяйству Член комитета Тесов Михаил Николаевич Фракция «Единая Россия»Член фракции Комитет по государственному строительству, безопасности и местному самоуправлениюЧлен комитета Толстая Екатерина Александровна Фракция «Единая Россия»Член фракции Комитет по социальной политикеЧлен комитета Комиссия по регламенту и депутатской этикеЧлен комиссии Трифонов Виктор Александрович Комитет по государственному строительству, безопасности и местному самоуправлениюПредседатель комитета Харитонов Сергей Алексеевич Фракция «Единая Россия»Член фракции
Что получилось? Атрибутом valign="top"
обладают не только ячейки с именами! Давайте найдем другую зацепку, но чтобы наверняка! Обратим внимание на атрибут width
‒ ширина ячейки. У ФИО он равен 20%, а у других ‒ 25%! Воспользуемся этим фактом.
for t in table.find_all('td', valign= "top", width = "20%"):
print(t.text)
Абакумов Владимир Евгеньевич Алёшина Галина Ивановна Альховик Алексей Иванович Артемьев Сергей Александрович Атанов Егор Васильевич Балберов Александр Александрович Белов Сергей Александрович Бычков Денис Владимирович Воробьев Николай Юрьевич Выставкин Михаил Борисович Грязев Михаил Васильевич Ермаков Александр Сергеевич Зайцева Ольга Сергеевна Залетин Сергей Викторович Иванцов Михаил Евгеньевич Кирьянова Елена Сергеевна Кондрашов Юрий Викторович Котик Людмила Ивановна Лебедев Алексей Александрович Макаровец Николай Александрович Малазония Надежда Николаевна Марьясова Юлия Александровна Моисеев Юрий Фясыхович Москалец Александр Петрович Николаева Наталия Вячеславовна Нуждихин Григорий Вячеславович Панин Владимир Алексеевич Парамонова Ольга Владимировна Попов Николай Кузьмич Рем Александр Викторович Самошин Андрей Анатольевич Симонов Александр Федорович Слюсарева Ольга Анатольевна Судариков Анатолий Павлович Тесов Михаил Николаевич Толстая Екатерина Александровна Трифонов Виктор Александрович Харитонов Сергей Алексеевич
Получилось!
(К слову, при создании своих html-страниц очень рекомендуется задавать размер в относительном, а не абсолютном виде, то есть в процентах от общего размера страницы, а не фиксированным числом. Если выставить определенную ширину объекта, например, 10 см, то она никак не будет изменяться в зависимости от браузера, масштаба, устройства, на котором просматривается страница, что плохо.)
Будем выбирать только те ячейки, где width
равен 25%
. Из них будем доставать только текст (ФИО) и добавлять его в заранее приготовленный пустой список names
.
names = []
for t in table.find_all('td', valign= "top", width = "20%"):
names.append(t.text)
Посмотрим на список:
names
['Абакумов Владимир Евгеньевич', 'Алёшина Галина Ивановна', 'Альховик Алексей Иванович', 'Артемьев Сергей Александрович', 'Атанов Егор Васильевич', 'Балберов Александр Александрович', 'Белов Сергей Александрович', 'Бычков Денис Владимирович', 'Воробьев Николай Юрьевич', 'Выставкин Михаил Борисович', 'Грязев Михаил Васильевич', 'Ермаков Александр Сергеевич', 'Зайцева Ольга Сергеевна', 'Залетин Сергей Викторович', 'Иванцов Михаил Евгеньевич', 'Кирьянова Елена Сергеевна', 'Кондрашов Юрий Викторович', 'Котик Людмила Ивановна', 'Лебедев Алексей Александрович', 'Макаровец Николай Александрович', 'Малазония Надежда Николаевна', 'Марьясова Юлия Александровна', 'Моисеев Юрий Фясыхович', 'Москалец Александр Петрович', 'Николаева Наталия Вячеславовна', 'Нуждихин Григорий Вячеславович', 'Панин Владимир Алексеевич', 'Парамонова Ольга Владимировна', 'Попов Николай Кузьмич', 'Рем Александр Викторович', 'Самошин Андрей Анатольевич', 'Симонов Александр Федорович', 'Слюсарева Ольга Анатольевна', 'Судариков Анатолий Павлович', 'Тесов Михаил Николаевич', 'Толстая Екатерина Александровна', 'Трифонов Виктор Александрович', 'Харитонов Сергей Алексеевич']
Теперь перейдем к партиям. Тут нет никакого отличительного атрибута, но, к счастью, в каждой нужной ячейке есть слово Фракция. Давайте вооружимся этим фактом и с помощью цикла и условия заполним список fracs
:
fracs = []
for t in table.find_all('td', valign= "top", width = "25%"):
if "Фракция" in t.text:
fracs.append(t.text)
Вроде бы, все хорошо:
fracs
['Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «ЛДПР»Руководитель фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «ЛДПР»Заместитель руководителя фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «КПРФ»Руководитель фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Руководитель фракции', 'Фракция «КПРФ»Заместитель руководителя фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции']
На самом деле, не очень. Давайте сравним число депутатов и партий:
print(len(names))
print(len(fracs))
38 36
Партий получилось меньше! И это неудивительно: в таблице есть два беспартийных депутата. Так как их всего двое, давайте просто вручную добавим на соответствующие им позиции в списке fracs
пустые строки. Заодно вспомним про метод .insert()
‒ метод, который позволяет вставить в список новый элемент на определенную позию, сдвинув остальные.
names.index('Бычков Денис Владимирович') # место 7
7
names.index('Трифонов Виктор Александрович') # место 36
36
fracs.insert(7, "")
fracs.insert(36, "")
fracs
['Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «ЛДПР»Руководитель фракции', 'Фракция «Единая Россия»Член фракции', '', 'Фракция «Единая Россия»Член фракции', 'Фракция «ЛДПР»Заместитель руководителя фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «КПРФ»Руководитель фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Руководитель фракции', 'Фракция «КПРФ»Заместитель руководителя фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', 'Фракция «Единая Россия»Член фракции', '', 'Фракция «Единая Россия»Член фракции']
Теперь все хорошо. Разобраться с комитетами и комиссиями мы сегодня не успеем, но вот выцепить из элементов списка fracs
только названия партий сумеем. И на помощь нам придут уже знакомые регулярные выражения.
Импортируем библиотеку re.
import re
Воспользуемся функцией findall()
: найдем все названия внутри кавычек-елочек (их проще скопировать из текста или кода).
parties = []
for f in fracs:
p = re.findall('«.+»', f)[0]
parties.append(p)
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-21-00bb1a315aff> in <module>() 1 parties = [] 2 for f in fracs: ----> 3 p = re.findall('«.+»', f)[0] 4 parties.append(p) IndexError: list index out of range
Почему мы получили ошибку? Посмотрим, что представляют собой совпадения, найденные с помощью findall()
:
for f in fracs:
print(re.findall('«.+»', f))
['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«ЛДПР»'] ['«Единая Россия»'] [] ['«Единая Россия»'] ['«ЛДПР»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«КПРФ»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«КПРФ»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] ['«Единая Россия»'] [] ['«Единая Россия»']
У нас есть пустые списки! Они соответствуют беспартийным депутатам. Поэтому в таких списках без элементов Python не может найти элемент с индексом 0. Давайте добавим условную конструкцию: если длина списка не равна 0, то пусть в parties
добавляется единственный элемент из списка, возвращенного findall()
, если длина списка равна 0, то пусть в parties
добавляется пустая строка.
parties = []
for f in fracs:
if len(f) != 0:
p = re.findall('«.+»', f)[0]
parties.append(p)
else:
parties.append('')
parties
['«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«ЛДПР»', '«Единая Россия»', '', '«Единая Россия»', '«ЛДПР»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«КПРФ»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«КПРФ»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '«Единая Россия»', '', '«Единая Россия»']
А теперь уберем сами кавычки: если названия партий будут хранится в датафрейме в таком виде, искать их будет неудобно, поскольку придется искать или копировать откуда-то эти кавычки-елочки. Для этого выберем в строке все символы, кроме первого (с индексом 0) и последнего (с индексом -1).
parties = []
for f in fracs:
if len(f) != 0:
p = re.findall('«.+»', f)[0]
parties.append(p[1:-1]) # правый конец не включается в интервал
else:
parties.append('')
parties
['Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'ЛДПР', 'Единая Россия', '', 'Единая Россия', 'ЛДПР', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'КПРФ', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'КПРФ', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', 'Единая Россия', '', 'Единая Россия']
Теперь у нас есть два списка: ФИО депутатов и их партийная принадлежность. Осталось объединить их в датафрейм pandas.
Импортируем библиотеку:
import pandas as pd
Создадим датафрейм, подав на вход функции DataFrame()
словарь, ключами которого являются названия столбцов, а значениями ‒ списки, которые станут столбцами таблицы.
df = pd.DataFrame({'name': names, 'party': parties})
Готово!
df.head()
name | party | |
---|---|---|
0 | Абакумов Владимир Евгеньевич | Единая Россия |
1 | Алёшина Галина Ивановна | Единая Россия |
2 | Альховик Алексей Иванович | Единая Россия |
3 | Артемьев Сергей Александрович | Единая Россия |
4 | Атанов Егор Васильевич | Единая Россия |
Можем выгрузить таблицу в csv-файл и на этом закончить.
df.to_csv("Tula_Obl_Duma.csv")