[Python] Extractions de liens d'une page web

Fermé
Python2 - 11 mai 2003 à 18:36
 Bennouas TouFik - 21 août 2003 à 17:55
Bonjour ,
J'ai réaliser un prog pour extarire les liens d'une page web en python mais je ne sais pas trop si je dois faire une interface graphique... J'aimerai bien que qq'un puisse m'éclairer et m'expliquer comment faire

voici mon prog si cela peut vous aider a voir + clair
import urllib

def geturl(url):#cette methode retourne le contenu du fichier et #son type grace a l'URL

f = urllib.urlopen() "retoure un fichier en tant qu'objet pouvant #être récupéré et lu de l'URL donné
data = f.read()
headers = f.info() #retourne un dico contenant les URL #retournées
f.close()
if headers.has_key(".html"):
mimetype = headers[".html"]
return 1
else:
#si le protocale utilisé n'est pas HTTP retourne un dico #vide et devine l' extension du fichier
if url[-5:] == ".html":
mimetype = "text/html"
else:
mimetype = ? #j'ai un prob a ce niveau
return (data, mimetype)

from sgmllib import SGMLParser
import string

class LinkExtractor(SGMLParser):

def __init__(self):#constructeur, initialise les liens(variables #d'instance) dans une liste vide
self.links = []
SGMLParser.__init__ (self)

def do_a(self, attributs):#methode invoqué par SGMLParser qd #un <A> est rencontré
for (nom, valeur) in attributs:
if nom == "href":
valeur = cleanlink(valeur)
if valeur:
self.links.append(valeur)

def getlinks(self):#peut etre appellé par l'utilisateur pour #récupérer la liste des liens collecté
return self.links

def cleanlink(link):#enlève tout ce qui ne peut pas faire partie de #la syntaxe des URL
i = string.find(link, '#')
if i >= 0:
link = link[:i]
words = string.split(link) # Split les espaces

string.join(words, "") # Joint les mot sans les espaces
print cleanlink(link)

def getlinks(url):
(data, mimetype) = geturl(url)
if mimetype == "text/html":
parser = LinkExtractor()
parser.feed(data)
parser.close()
links = parser.getlinks()
else:
links = [] # les pages qui ne sont pas HTML n'ont pas de liens
return links
print getlinks(url)

import urlparse

def getfulllinks(url):#utiliser pour rassembler les liens retourner #par getlinks
links = getlinks(url)
fulllinks = []
for link in links:
full = urlparse.urljoin(url, link)
fulllinks.append(full)
return fulllinks
print getfulllinks(url)

SOURTOUT si vous avez dzs suggestions à faire ou si vous voyer des erraurs je prendrai vos remarques en comptes avec plaisir


MERCI

Merci d'avance pour votre aide
A voir également:

9 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
12 mai 2003 à 13:49
sgmllib ?
Arg... c'est prendre un marteau-pilon pour écraser une fraise.

Le module HTMLParser devrait suffir.
Ou même une simple expression régulière !

Par exemple, pour extraire tous les liens du fichier toto.html, je ferais ça:

import re
links_regexp = re.compile('<a href="?(.*?)"?>',re.IGNORECASE)
html = open('toto.html','rb').read()
print links_regexp.findall(html)


C'est nettement plus léger, et ça fonctionne très bien ! :-)
1
Merci bcp pour vos conseils c'est super sympa au niveau de l'interface graph. vous n'auriez pas une idée?
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659 > Python
15 mai 2003 à 11:02
Pour l'interface graphique, tu as le choix !

Mais tout dépend de tes contraintes.
Sous quel système devra tourner ton programme ?
Windows seul ? Linux seul ? Les deux ? autres ?

tcl/tk, inclu en standard dans Python (multiplateformes)
wxWindows, plus puissant, multiplatformes
Microsoft Windows MFC, Windows uniquement
GTK+, Unix/Linux, et éventuellement Windows
QT
Gnome
KDE
autre... ?

Python est capable d'utilise à peu près n'importe quel kit graphique, mais il faut faire un choix.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
12 mai 2003 à 14:01
Si tu as besoin de parser des choses en plus (contenu de la balise <a>, autres balises), le module HTMLParser est très sympa !

Voici un exemple d'utilisation de HTMLParser qui parse les tableaux HTML:
http://sebsauvage.net/python/html2csv.py
0
J'avais pensé a utilisé CGI interface web est une bonne idée ,?
Sinon mon prog doit tourné sous linux et windows
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
23 mai 2003 à 11:47
ça dépend: ton programme sera utilisé à partir de quoi ?

Une simple console (clavier+écran en mode texte), environnement graphique (Windows, KDE, X...?), ou par le web (navigateurs) ?

Le plus simple, c'est la console (ligne de commande).
0
Pour l'instant je me limite à une cosole mais comme je veux aussi extraire des liens de pages en ligne il faudra peut êtrev un navigateur c'est pour cela que j'ai voulu utiliser CGI
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
23 mai 2003 à 12:03
ok...

Dans ce cas, oui en cgi ça peut être bien.

Si tu as besoin d'exemples de cgi Python, c'est là:
http://wikipython.flibuste.net/moin.py/CodesCGI
0
Salut tt le monde

Je suis sous win2000 pro, et je veux essayer la commande python, j'ai ca comme erreur comment je fais pour la définir ?

>>> python
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'python' is not defined

Merci
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
8 juil. 2003 à 17:30
Hello !
Si tu vois déjà ">>>", c'est que tu es déjà dans Python !
Essai de taper:
print 1+2

Et pour quitter la ligne de commande Python, tape CTRL+Z.

Ensuite, je te conseille de créer des fichiers .py contenant tes programmes. Il suffira de faire python monprogramme.py pour exécuter le programme.
0
Salut seb,

J'ai testé, j'ai crée un fichier variableENV.py
Ca me fait ca, je dois mettre où mes fichiers .py

>>> python variableENV.py
File "<stdin>", line 1
python variableENV.py
^
SyntaxError: invalid syntax
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659 > ZcKy
8 juil. 2003 à 17:37
ahum:
c:\> python monprogramme.py
3


ou bien
>>>import monprogramme.py
3
0
ZcKy > sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019
8 juil. 2003 à 17:54
Merci seb

ca marche
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 659
8 juil. 2003 à 17:37
Je reviens sur ma suggestion d'utiliser le module HTMLParser.
Il est parfait, mais il ne supporte pas le code HTML invalide.
ça n'est pas un problème, sauf quand on veut parser le code HTML tout p*urri qu'on trouve sur internet (argleu).

SGMLParser, lui, supporte très bien l'HTML très mal formatté.
Je pourrai vous donner un exemple de code si ça vous intéresse (c'est très proche de HTMLParser).

Notez que comme XHTML ne fait pas partie de la norme SGML, SGMLParser ne traitera pas correctement les tags du style <br/>.
(Mais on peut s'en tirer avec 2 expressions régulières pour réécrire ces balises avant de les donner à manger à SGMLParser ; je pourrais les donner si ça intéresse quelqu'un).


signé: sebsauvage, qui s'est aperçu récemment que parser le code HTML trouvé "in-the-wild", c'est beaucoup, beaucoup plus délicat qu'il n'y paraît, mais que le monsieur il a trouvé des solutions :-)
(PS: je suis en train de m'amuser à écrire un proxy HTTP sous forme de CGI du genre de megaproxy.com ou nph-proxy)
0
Bennouas TouFik
21 août 2003 à 17:55
Bonjour,

Je dois réaliser un petit crawler en python et j'ai un problème au niveau du parseur de page Web. Le problème est qu'un document html est codé en utilisant des code ( iso-8859-1 ou autre) et donc dans le code html je me retrouve avec des &#xxx; ou encore à . Exist-il un moyen de convertir ces mots en utilisant le bon code de caractére.

Merci.
0