Analyse automatique des tableaux de postes d'enseignants chercheurs sur GALAXIE
Pierre H. — 18 février 2014
In [36]:
import pandas
import urllib
from bs4 import BeautifulSoup
from IPython.display import HTML, display_html
Postes publiés dans GALAXIE (cf. page source)
Extrait de "Postes d'enseignants-chercheurs" :
pandas.read_html
→ cassé :-(
In [15]:
url = 'https://www.galaxie.enseignementsup-recherche.gouv.fr/ensup/ListesPostesPublies/Emplois_publies_TrieParCorps.html'
d = pandas.read_html(url, attrs={'class': 'tab'})
Lecture du fichier (et correction de malformation du html)
In [179]:
f = urllib.urlopen(url)
def fix_th(f):
for line in f:
if '<th' in line:
line = line.replace('</td>', '</th>')
yield line
s = ''.join(fix_th(f))
f.close()
#print(s[:2000])
len(s)
Out[179]:
Parsing du HTML : attention au choix du parser !
In [182]:
soup = BeautifulSoup(s, 'html.parser')
print(soup.title.text)
In [183]:
tabs = soup.find_all('table')
# Les 2 tableaux imbriqués :
(len(tabs[0].find_all('tr', recursive=False)),
len(tabs[1].find_all('tr', recursive=False)) )
Out[183]:
In [184]:
# Extraction des lignes :
rows = tabs[1].find_all('tr', recursive=False)
tr_head = rows[0]
rows = rows[1:]
# Affichage 1ère et dernière ligne du tableau
HTML('<table>{}{}</table>'.format(tr_head, ''.join(str(r) for r in rows[0:1]+rows[-1:])))
Out[184]:
In [148]:
head = [th.b.text for th in tr_head.find_all('th')]
print('nombre de colonnes : {}'.format(len(head)))
head
Out[148]:
In [185]:
# Vérification des lignes:
i = 0
for tr in rows:
cols = tr.find_all('td')
i+= 1
assert len(cols) == 16
i
Out[185]:
Flitrage des lignes : sélection de la section 63
In [157]:
head[7:10]
Out[157]:
In [177]:
def section_filter(rows, section):
for tr in rows:
cols = tr.find_all('td')
row_sections = [td.text for td in cols[7:10]]
row_sections = [int(n) for n in row_sections if n != '']
if section in row_sections:
yield tr
selected_rows = list(section_filter(rows, 63))
HTML('<table>{}{}</table>'.format(tr_head, ''.join(str(r) for r in selected_rows)))
Out[177]:
In [ ]: