[Python] Extractions de liens d'une page web
Python2
-
Bennouas TouFik -
Bennouas TouFik -
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
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:
- [Python] Extractions de liens d'une page web
- Supprimer une page word - Guide
- Web office - Guide
- Comment traduire une page web - Guide
- Capturer une page web complète - Guide
- Créer une page web - Guide
9 réponses
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 ! :-)
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 ! :-)
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
Voici un exemple d'utilisation de HTMLParser qui parse les tableaux HTML:
http://sebsauvage.net/python/html2csv.py
J'avais pensé a utilisé CGI interface web est une bonne idée ,?
Sinon mon prog doit tourné sous linux et windows
Sinon mon prog doit tourné sous linux et windows
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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
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
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.
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.
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)
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)
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 xx; ou encore à . Exist-il un moyen de convertir ces mots en utilisant le bon code de caractére.
Merci.
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 xx; ou encore à . Exist-il un moyen de convertir ces mots en utilisant le bon code de caractére.
Merci.
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.