Formulaire n ° 16

Les enseignants travaillant dans les universités russes sont périodiquement confrontés à la nécessité de fournir à l'administration une liste de leurs travaux scientifiques et pédagogiques. Par exemple, pour la (ré) élection à un poste, l'attribution d'un titre, etc. Education de la Fédération de Russie. Je suis devenu trop paresseux pour remplir ce formulaire ridicule manuellement et j'ai écrit un petit script python qui génère le tableau nécessaire basé sur les informations obtenues à partir de la bibliothèque électronique scientifique elibrary.ru . Peut-être que quelqu'un sera intéressé par cela, alors vous trouverez ci-dessous une description de cette procédure ...





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



. :





Ligne de tableau de elibrary.ru
elibrary.ru

№268 ( №3 . 52) - :





Rangée de tableau selon le formulaire n ° 16
№16

Le script de conversion du format de table est basé sur l'utilisation de la bibliothèque BeautifulSoup , dont j'ai été très rapide et que j'ai utilisée pour la première fois de ma vie. Voici ce que j'ai:





#!/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))    
      
      



Pour terminer la tâche, vous devez exécuter le script dans le dossier qui contient le fichier index.html



dans lequel nous avons enregistré la table avec elibrary.ru. À la sortie, un fichier est généré table.html



qui peut être facilement téléchargé vers Google Docs, où il peut être soumis à des modifications finales telles que la modification de la largeur des colonnes, le choix des polices, etc.








All Articles