[PageD'Accueil] [IndexDesTitres] [IndexDesTermes

Extraire les liens d'une page HTML

On peut imaginer plusieurs façons de récupérer la liste des liens d'une page.

Avec une expression régulière

Le module re (expressions régulières) est un moyen simple, rapide et généralement suffisant pour extraire des informations précises d'une page.

La fonction findall vous donnera toutes les chaînes de caractères qui correspondent à votre expression régulière.

   1 import re, urllib
   2 
   3 htmlSource = urllib.urlopen("http://sebsauvage.net/index.html").read()
   4 listeDeLiens= re.findall('<a href=(.*?)>',htmlSource)
   5 for lien in listeDeLiens:
   6     print lien 

Avec le parseur HTML

Le module HTMLParser est capable de comprendre le code HTML.

   1 import HTMLParser, urllib
   2 
   3 class linkParser(HTMLParser.HTMLParser):
   4     def __init__(self):
   5         HTMLParser.HTMLParser.__init__(self)
   6         self.liens = []
   7     def handle_starttag(self, tag, attrs):
   8         if tag=='a':
   9             self.liens.append(dict(attrs)['href'])
  10 
  11 htmlSource = urllib.urlopen("http://sebsauvage.net/index.html").read()
  12 p = linkParser()
  13 p.feed(htmlSource)
  14 for lien in p.liens:
  15     print lien 

Pour chaque balise HTML rencontrée, la méthode handle_starttag() sera appellée. Par exemple, si une balise <a href=http://google.com> est rencontrée, la méthode sera appelée comme suit: handle_starttag(self,'A',[('href','http://google.com')]).

Vous pouvez également jeter un coup d'oeil sur les autres méthode handle_*() dans la documentation de Python.

Note: HTMLParser supporte aussi l'XHTML. Par contre HTMLParser n'aime pas les pages HTML malformées. Si vous avez besoin de parser de telles pages, vous pouvez utiliser le module sgmllib qui supporte très bien les pages malformées (mais attention: Si sgmllib supporte HTML, il ne supporte pas XHTML.)

Avec le module BeautifulSoup

Le module BeautifulSoup offre une interface simple pour parcourir une page html, afin d'extraire des données. Il supporte les pages relativement mal formées, car il s'appuie sur SGMLParser. Il est disponible sur http://www.crummy.com/software/BeautifulSoup/

   1 import BeautifulSoup, urllib
   2 s=BeautifulSoup.BeautifulSoup()
   3 html=' '.join(urllib.urlopen('http://wikipython.flibuste.net/').readlines())
   4 
   5 s.feed(html)
   6 for i in  s('a'):
   7         try:
   8             print i['href']
   9         except:
  10             pass

2016-06-05 21:43