Skip to content

Instantly share code, notes, and snippets.

@allatambov
Created March 30, 2020 17:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save allatambov/5397b803f32bd5a6530fcee1b6e98a17 to your computer and use it in GitHub Desktop.
Save allatambov/5397b803f32bd5a6530fcee1b6e98a17 to your computer and use it in GitHub Desktop.
import pandas as pd
import requests
from bs4 import BeautifulSoup
# ссылка на результаты выборов 2016
# Бурятия, данные по одной ТИК (Баргузинская)
# один столбец – один УИК +
# данные по всему ТИК в самом первом столбце
html_with_data = "http://www.buriat.vybory.izbirkom.ru/region/region/buriat?action=show&root=32000008&tvd=2032000653530&vrn=100100067795849&region=4&global=true&sub_region=4&prver=0&pronetvd=0&vibid=2032000653530&type=464"
# загружаем страницу и забираем текстовый слой
# с кодом html
page = requests.get(html_with_data)
soup = BeautifulSoup(page.text)
# смотрим на код страницы и обнаруживаем,
# что главная таблица с данными имеет
# атрибут style с длинным значением width:...
# findAll() возврашает список из одного элемента
# извлекаем этот единственный элемент
# и сохраняем в table
table = soup.findAll('table',
{'style': 'width:100%;border-color:#000000'})[0]
# read_html() работает со строками
# превращаем table в строку через str()
# возвращается список из таблиц
pd.read_html(str(table))
# выберем из длинного списка выше таблицу с индексом 1
# здесь данные по всей ТИК
pd.read_html(str(table))[1]
# транспонируем, чтобы по столбцам шли названия показателей
part1 = pd.read_html(str(table))[1].T
part1
# выберем из длинного списка выше таблицу с индексом 2
# здесь данные по каждому УИКу
pd.read_html(str(table))[2]
# тоже транспонируем, чтобы одна строка
# соответствовала одному УИКу
part2 = pd.read_html(str(table))[2].T
# склеиваем две части
final = pd.concat([part1, part2])
final
# убираем строку 0
final = final.iloc[1:, :]
final
# новую строку 0 используем как названия столбцов
final.columns = final.iloc[0, :]
final
# вместо nan называем первый столбец УИК
final.rename(columns = {np.nan: 'УИК'}, inplace=True)
final
# убираем строку 0
final = final.iloc[1:, :]
# меняем тип столбцов с 1 до конца на float
left = final.iloc[:, 0]
right = final.iloc[:, 1:].astype(float)
results = pd.concat([left, right], axis=1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment