Traducteur de page html avec BeautifulSoup

Comme avec HTMLParser, il suffit de surcharger les méthodes handle_data et handle_starttag.

Commençons par une page basique, sans images.

In [1]:
from bs4 import BeautifulSoup as bs
In [2]:
from urllib import *
In [3]:
u = 'http://igm.univ-mlv.fr/~jyt/M1_python'
In [4]:
s = urlopen(u).read()
In [5]:
s
Out[5]:
'<html>\n\t<body>\n\t\t<H1> M1 Informatique : Python </H1>\n\t\t<ul>\n\t\t\t<li> Commencer ici : <a href="http://www.python.org/">python.org</a>\n\t\t\t<li> La <a href="http://docs.python.org/2.7">documentation</a> officielle\n\t\t\t<li> Le <a href="http://www.pythonchallenge.com/"> Python Challenge</a>\n\t\t\t<li> <a href="http://diveintopython.net/"><i>Dive into Python</i></a>  \n\t\t\tpar <a href="http://en.wikipedia.org/wiki/Mark_Pilgrim_%28software_developer%29">Mark Pilgrim</a> (un livre recommand&eacute;);\n\t\t\t<a href="http://www.diveintopython3.net/">version Python 3</a>. \n\t\t\t<li> La <a href="http://fr.wikipedia.org/wiki/Python_%28langage%29">page</a> de Wikip&eacute;dia contient un bon r&eacute;sum&eacute;\n\t\t\t<li> Introduction au <i>notebook</i> ipython ou jupyter : <a href="intro_jupyter.html">html</a>, <a href="intro_jupyter.ipynb">ipynb</a>\n\t\t\t<ul> Cours 1 (29/09/2017)\n\t\t\t\t<li> Python 2 <a href="python_M1_2017-1.html">html</a>, <a href="python_M1_2017-1.ipynb">ipynb</a>\n\t\t\t\t<li> Python 3 <a href="M1_python3-1.html">html</a>, <a href="M1_python3-1.ipynb">ipynb</a> \n\t\t\t</ul>\n\t\t\t<a href="td1.html"> TD 1</a> (29/09/2017)\n\t\t\t<li> Corrig&eacute; du TD 1\n\t\t\t<ul>\n\t\t\t\t<li><a href="td1_sol.html">Python 2</a>\n\t\t\t\t<li><a href="td1_sol_3.html">Python 3</a>\n\t\t\t</ul>\n\t\t\t<a href="script.py.html">Mod&egrave;le</a> de script\n\t\t\t<li> Cours 2 (13/10/2017) : <a href="python_M1_2017-2.html">html</a>, <a href="python_M1_2017-2.ipynb">ipynb</a>\n\t\t\t<li><a href="td2.html">TD 2</a> (13/10/2017)\n\t\t\t<li> Cours 3 (20/10/2017) : <a href="python_M1_2017-3.html">html</a>, <a href="python_M1_2017-3.ipynb">ipynb</a>\n\n\t\t\t<li><a href="td3_2017_texte.html">TD 3</a> (20/10/2017)\n\t\t\t\n\n\t\t</ul>\n\t</body>\n</html>\n\n\t\t\n'
In [6]:
# Touillage d'un mot comme dans le TD2

import random, re
p = re.compile('(\w)(\w\w+)(\w)', re.M)
def touille(m):
    milieu = list(m.group(2))
    random.shuffle(milieu)
    return m.group(1) + ''.join(milieu) + m.group(3)
In [16]:
# Pour commencer, on ne modifie que le texte
# Pour surcharger handle_data, on créee une classe dérivée de BeautilfulSoup

class mySoup(bs):
    def __init__(self,s):
        bs.__init__(self,s,'html.parser')
        
    def handle_data(self,x):
        try:
            self.current_data.append(p.sub(touille,x)) # currentData dans les version plus anciennes
        except AttributeError:
            self.current_data = [p.sub(touille,x)]
In [17]:
soup = mySoup(s)
In [18]:
print soup.getText()


 M1 Ifuaqmntiore : Ptoyhn 

 Cecomenmr ici : potyhn.org
 La dmoucintatoen ofcfeiille
			 Le  Ptyohn Chaneglle
 Dvie itno Pohtyn  
			par Mark Piglrim (un lvire ramemcnodé);
			vrsieon Phtoyn 3. 
			 La page de Wikipédia ceonntit un bon résumé
			 Icnitrdooutn au nooebtok itophyn ou juyeptr : html, ipynb
 Curos 1 (29/09/2107)
				 Poyhtn 2 hmtl, inypb
 Phtoyn 3 hmtl, iypnb

 TD 1 (29/09/2107)
			 Criorgé du TD 1
			
Pothyn 2
Pothyn 3

Modèle de sicprt
			 Cuors 2 (13/10/2107) : html, iypnb
TD 2 (13/10/2107)
			 Crous 3 (20/10/2107) : hmtl, iynpb
TD 3 (20/10/2017)
			

		




In [22]:
# pour visualiser, on sauvegarde dans un fichier
open('bla.html','w').write(str(soup))

Résultat : bla.html

In [26]:
# Pour récupérer des liens fonctionnels et les images,
# il faut maintenant surcharger handle_starttag
# On se contentera des attributs href et src, 
# mais il resterait beaucoup d'autres cas à prendre en compte pour être complet.

from urlparse import urljoin

class newSoup(mySoup):
    def __init__(self,s,u):
        self.url = u
        mySoup.__init__(self,s)
    
    def handle_starttag(self,name,namespace,nsprefix,attrs):
        if 'href' in attrs: attrs['href'] = urljoin(self.url,attrs['href'])
        if 'src' in attrs: attrs['src'] = urljoin(self.url,attrs['src'])
        mySoup.handle_starttag(self,name,namespace,nsprefix,attrs)
        
In [27]:
u ='http://igm.univ-mlv.fr/~jyt/'
s = urlopen(u).read()
soup=newSoup(s,u)
In [28]:
open('blu.html','w').write(str(soup))

Résultat : blu.html

In [ ]: