Rechercher : dans
Par :

[Python] Extractions de liens d'une page web

Dernière réponse le 21 aoû 2003 à 17:55:14 Python2, le 11 mai 2003 à 18:36:30 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [Python] Extractions de liens d'une page web » dans :
[Webmaster] Publier facilement une vidéo dans une page web VoirPublier une vidéo dans une page web n'est pas toujours évident: Selon le format (AVI, MPG, MOV...) tout le monde ne possède pas forcément le bon plugin et le bon codec. En revanche, la quasi-totalité des navigateurs possèdent le plugin Flash (SWF)....
[Webmaster] Les polices dans les pages web VoirLes limites du web Quand vous utilisez une police dans une page web, elle ne s'affichera que si l'internaute a la même police installée sur son ordinateur. Vous n'avez aucun moyen de forcer l'internaute à télécharger et installer une police,...
Javascript - Centrer verticalement une page web VoirPour centrer verticalement une page web, impossible de s'en sortir en css. Une solution bien pratique : JavaScript. 1. Le fichier .js 2. La page .html 3. Utilisation 4. Inconvénients 5. Rappel Merci à Dalida pour la source du...

1

sebsauvage, le 12 mai 2003 à 13:49:51

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 ! :-)

Répondre à sebsauvage

3

Python, le 14 mai 2003 à 21:07:04

Merci bcp pour vos conseils c'est super sympa au niveau de l'interface graph. vous n'auriez pas une idée?

Répondre à Python

4

sebsauvage, le 15 mai 2003 à 11:02:57

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.

Répondre à sebsauvage

2

sebsauvage, le 12 mai 2003 à 14:01:47

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

Répondre à sebsauvage

5

python, le 23 mai 2003 à 11:34:41

J'avais pensé a utilisé CGI interface web est une bonne idée ,?
Sinon mon prog doit tourné sous linux et windows

Répondre à python

6

sebsauvage, le 23 mai 2003 à 11:47:11

ç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).

Répondre à sebsauvage

7

Python, le 23 mai 2003 à 11:50:19

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

Répondre à Python

8

sebsauvage, le 23 mai 2003 à 12:03:49

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

Répondre à sebsauvage

9

ZcKy, le 8 jui 2003 à 17:28:53

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

Répondre à ZcKy

10

sebsauvage, le 8 jui 2003 à 17:30:58

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.

Répondre à sebsauvage

11

ZcKy, le 8 jui 2003 à 17:35:15

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

Répondre à ZcKy

13

sebsauvage, le 8 jui 2003 à 17:37:48

Ahum:
c:\> python monprogramme.py
3


ou bien
>>>import monprogramme.py
3

Répondre à sebsauvage

14

ZcKy, le 8 jui 2003 à 17:54:42

Merci seb

ca marche

Répondre à ZcKy

12

sebsauvage, le 8 jui 2003 à 17:37:03

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)

Répondre à sebsauvage

15

 Bennouas TouFik, le 21 aoû 2003 à 17:55:14

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.

Répondre à Bennouas TouFik
Collection CommentÇaMarche.net