In [2]:
from bs4 import BeautifulSoup
#это пакет, который нам нужен, чтобы обрабатывать HTML
#http://www.crummy.com/software/BeautifulSoup/bs4/doc/ — тут к нему документация
In [3]:
import urllib2
#этот пакет понадобится, чтобы скачивать страницы
In [51]:
data=urllib2.urlopen("http://www.moscow_city.vybory.\
izbirkom.ru/region/region/moscow_city?action\
=show&root=177400203&tvd=27720001368299&\
vrn=27720001368289&region=77&global=null&s\
ub_region=77&prver=0&pronetvd=null&vibid=2772\
0001368299&type=222").read()
#считали страницу с этим жутким адресом в переменную data
In [52]:
#Проверим, что считалось что-то разумное
data[0:100]
Out[52]:
'\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//RU">\r\n<html>\r\n<head>\r\n<'
In [54]:
#похоже на правду. Теперь сделаем из этого объект, с которым можно работать
bs=BeautifulSoup(data.decode('cp1251'))
#.decode('cp1251') нужно, чтобы переконвертировать текст из кодировки CP1251 (она же windows-1251)
#во внутреннее представление python. Чтобы кракозябр не было
In [56]:
bs.title
#Проверим, что получилось что-то разумное. Должны получить title документа (одноименный тег)
Out[56]:
<title>Сведения о проводящихся выборах и референдумах</title>
In [57]:
print bs.title.string
Сведения о проводящихся выборах и референдумах

In [60]:
bs.table
Out[60]:
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" width="100%">
</td>
</tr>
</table>
In [61]:
#первая табличка оказалась неудачной. Поищем более подходящую
table=bs.find_all('table')[7]
#вроде, в седьмой по счёту таблице лежат какие-то данные
#посмотрим на них повнимательнее
In [63]:
rows=table.find_all('tr')
#перечислим все строчки этой таблицы
In [64]:
rows[0]
Out[64]:
<tr bgcolor="#FFFFFF">
<td align="center" colspan="2" style="color:black" width="200"></td>
<td align="center" style="color:black">
<nobr><b>Сумма</b>
</nobr>
</td>
</tr>
In [65]:
#первая строчка никуда не годится
#посмотрим на вторую
rows[1]
Out[65]:
<tr bgcolor="#CCCCCC">
<td style="color:black" width="5%">
<nobr>1</nobr>
</td>
<td align="left" style="color:black" width="50">
<nobr>Число избирателей, внесенных в список</nobr>
</td>
<td align="right" style="color:black">
<nobr><b>74231</b>
</nobr><br/>
</td>
</tr>
In [68]:
#О, а это то, что нам надо. Видимо, что в каждой ячейке (<td>) в теге <nobr> написана какая-то информация
#Причём в последней — число, которое можно обрабатывать.
#Запишем содержимое это таблички в python'овский список
In [69]:
mytable=[]
for row in rows:
    cells=row.find_all('nobr')
    if len(cells)>2:
        mytable.append([cells[0].string, 
                    cells[1].string, 
                    int(cells[2].b.string) #поскольку в третьей ячейке число написано ещё и в теге <br>
                    ])
In [70]:
#теперь можно работать с этой табличкой
#например, найдём максимум по третьему столбцу
m=max(r[2] for r in mytable)
In [71]:
m
Out[71]:
74231
In [75]:
#найдём строчку, в которой достигается этот максимум
for r in mytable:
    if r[2]==m:
        print r[1]
Число избирателей, внесенных в список

Домашнее задание

Задача 1. перевести в машинночитаемый формат вторую часть таблицы с той же страницы (с данными по УИКам). Вычислить средний результат явки по всем УИКам. Найти УИКи с максимальной и минимальной явкой. Сохранить получившуюся таблицу в CSV.

Задача 2. (под звёздочкой): переконвертировать таким образом в CSV результаты выборов мэра Москвы 2013 по всем ТИК (то есть по всем районам). Для этого нужно написать код, который будет автоматически обращаться к разным страницам, соответствующим разным районам.

In []: