|
# -*- coding: utf-8 -*- |
|
|
|
from __future__ import unicode_literals |
|
import os, sys, codecs |
|
from pyquery import PyQuery as pq |
|
from multiprocessing import Pool |
|
|
|
def list_files(base_dir): |
|
for area in range(1, 32): |
|
curr_dir = base_dir + '/%02d' % area |
|
files = os.listdir(curr_dir) |
|
for f in files: |
|
if f.endswith('.html') and f not in ('index.html', 'list.html'): |
|
yield (area, f[0:-5], curr_dir + '/' + f) |
|
|
|
def get_headings(): |
|
res= ['Регион', 'Секция', 'Листи', 'Общо бюлетини', 'Избиратели по списък', 'част 1', 'част 2', 'под черта', 'гласували', 'удостоверения чл. 40', 'чл. 240', 'неизползвани', 'унищожени', 'по чл 265', 'чл. 227', 'чл. 228', 'сгрешени', 'намерени', 'намерени недействителни', 'действителни'] |
|
|
|
for i in (1,2,3,4,6,8,9,10,11,12,13,15,16,17,18,19,20,21,25,26,27,28,29,30): |
|
res.append('%d действ' % i) |
|
res.append('%d недейств' % i) |
|
return res |
|
|
|
|
|
def escape(text): |
|
return '"' + text.strip().replace('"', '') + '"' |
|
|
|
def parse_file(args): |
|
area, id, filename = args |
|
print area, id |
|
d = pq(filename=filename) |
|
results = [str(area), str(id)] |
|
|
|
tables = d('table') |
|
for t in range(0,5): |
|
table = tables.eq(t) |
|
row = 0 |
|
for el in d('tr', table): |
|
if t == 4 and row == 0: |
|
row += 1 |
|
continue |
|
|
|
|
|
parts = d('td', el) |
|
if t == 4: |
|
results.append(escape(parts[2].text)) |
|
results.append(escape(parts[3].text)) |
|
|
|
elif len(parts) > 1: |
|
results.append(escape(parts[1].text)) |
|
|
|
row += 1 |
|
|
|
return results |
|
|
|
def parse_all(base_dir='protokoli'): |
|
files = list(list_files(base_dir)) |
|
|
|
p = Pool(5) |
|
results = [get_headings()] + p.map(parse_file, files, 3) |
|
|
|
return results |
|
|
|
def save_to_csv(results): |
|
f = codecs.open('ep2014.csv', 'w', 'utf-8') |
|
for line in results: |
|
f.write(",".join(line) + "\r\n") |
|
f.close() |
|
|
|
if __name__ == '__main__': |
|
results = parse_all(sys.argv[1]) |
|
save_to_csv(results) |
Браво! Преференциите може ли да ги включим и тях? Добави и имената на общината и населеното място, за по-лесно намиране.