Os professores que trabalham em universidades russas enfrentam periodicamente a necessidade de fornecer à administração uma lista de seus trabalhos científicos e educacionais. Por exemplo, para (re) eleição para um cargo, atribuição de um título, etc. O formato de apresentação de informações, Formulário nº 16, foi desenvolvido para Deus sabe quando e ainda é usado nas profundezas burocráticas do Ministério da Ciência e Superior Educação da Federação Russa. Fiquei com preguiça de preencher este formulário ridículo manualmente e escrevi um pequeno script python que gera a tabela necessária com base nas informações obtidas na biblioteca eletrônica científica elibrary.ru . Talvez alguém se interesse por isso, então segue abaixo uma descrição desse procedimento ...
, elibrary.ru, , «» « ». «», « ». , html-, index.html
. :
№268 ( №3 . 52) - :
O script para converter o formato da tabela é baseado no uso da biblioteca BeautifulSoup , sobre a qual fui muito superficial e usei pela primeira vez na vida. Aqui está o que eu tenho:
#!/usr/bin/env python3
from bs4 import BeautifulSoup
from random import randint
from re import findall
YFrom, YTo = 2015, 2020 #
def NP(s): #
pages = s.split()[-1]
if '-' in pages:
P = pages.split('-')
np = 1 + int(float(P[1])-float(P[0]))
else:
np = randint(5, 10)
return '%d' % np #
def Year(s, FROM, TO): #
Ys = findall(r'\s\d{4}\.', s) # ' 2020.'
if not Ys: Ys = findall(r'\s\d{4}', s) # ' 2020'
if not Ys: return False # -
for y in Ys: Y = int(float(y)) #
if Y<FROM or Y>TO: return False
else: return True
with open('index.html', 'r') as fp:
soup = BeautifulSoup(fp, 'html.parser') #
soup.head.style.decompose() # , css ..
aname = soup.title.get_text().split('-')[1] #
aname = f' - {aname:s}\n'
soup.title.string = aname #
soup.find('span').string = aname #
soup.find('i').decompose() # -
soup.find('table').decompose() #
table = soup.find('table') #
table['border'] = 1 #
table['width'] = '100%' #
N = 1 #
rows = table.find_all('tr') #
for i in range(len(rows)): #
cols = rows[i].find_all('td') #
if len(cols)==3 and cols[1].find('span'): #
content = cols[1].get_text() #
title = cols[1].find('span').get_text() #
authors = cols[1].find('i').get_text() #
cites = int(cols[2].get_text()) #
content = content.replace(title, '') # , :
content = content.replace(authors, '') # content
thesis = content.replace(' : ','') #
abbook = content.replace(' : ','') #
if thesis != content: #
title += ' ()'; content = thesis #
elif abbook != content: #
title += ' ()'; content = abbook #
else: #
if '' in content: title+= ' ()'#
elif '' in content: title+= ' ()'#
else: title += ' ()' #
authors = authors.split(', ') #
if cites<10 or not Year(content, YFrom, YTo): #
rows[i].decompose() #
else: # - -
anumber = len(authors)
if anumber<5: PS = ''
else: PS = f' ., {anumber:d} .'
authors = ', '.join(authors[0:5]) + PS
cols[0].string = f'{N:3d}' #
cols[1].string = title #
cols[2].string = "." #
for info in [content, NP(content), authors]: #
A = soup.new_tag('td'); A.string = info ; rows[i].append(A)
N+= 1
else:
rows[i].decompose()
tr = soup.new_tag('tr') #
names = ['№ \', ' , ', ' ', ' ', ' .. .', '']
for name in names:
th = soup.new_tag('th')
th.string = name
tr.append(th)
table.insert(0, tr)
with open('table.html', 'w', encoding='utf-8') as fp: fp.write(str(soup))
Para concluir a tarefa, você precisa executar o script na pasta que contém o arquivo index.html
no qual salvamos a tabela com elibrary.ru. Na saída, é gerado um arquivo table.html
que pode ser facilmente carregado para o google docs, onde pode ser submetido a edições finais, como alteração da largura das colunas, escolha de fontes, etc.