Formulario No. 16

Los profesores que trabajan en universidades rusas se enfrentan periódicamente a la necesidad de proporcionar a la administración una lista de sus trabajos científicos y educativos. Por ejemplo, para (re) elección a un puesto, conferir un título, etc. El formato para presentar información, el Formulario No. 16, fue desarrollado para Dios sabe cuándo y todavía se usa en las profundidades burocráticas del Ministerio de Ciencia y Superiores. Educación de la Federación de Rusia. Me volví demasiado perezoso para completar este ridículo formulario manualmente y escribí un pequeño script en Python que genera la tabla necesaria basada en la información obtenida de la biblioteca electrónica científica elibrary.ru . Quizás alguien esté interesado en esto, por lo que a continuación se muestra una descripción de este procedimiento ...





, elibrary.ru, , «» « ». «», « ». , html-, index.html



. :





Fila de tabla de elibrary.ru
elibrary.ru

№268 ( №3 . 52) - :





Fila de la tabla de acuerdo con el formulario n. ° 16
№16

La secuencia de comandos para convertir el formato de tabla se basa en el uso de la biblioteca BeautifulSoup , que aprendí muy rápidamente y usé por primera vez en mi vida. Esto es lo que tengo:





#!/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 completar la tarea, debe ejecutar el script en la carpeta que contiene el archivo index.html



en el que guardamos la tabla con elibrary.ru. En la salida, se genera un archivo table.html



que se puede cargar fácilmente en los documentos de Google, donde se puede someter a ediciones finales, como cambiar el ancho de las columnas, elegir fuentes, etc.








All Articles