Page 1 sur 1

[R] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 17:37
par EvilRyu
Salut à tous!

J'essaie depuis quelques jours d'extraire un élément d'une page html, un chiffre ou une phrase qu'importe, mais tous mes essais ont été vains. J'ai trouvé une page donnant quelques pistes: VOIR

Cependant, je n'ai pas réussi à faire marcher ces scripts ( l'un est censé afficher un msgbox avec un bout de contenu, mais rien ne se passe chez moi ), il doit peut être manquer des éléments évidents pour un connaisseur, mais pour un débutant... :mrgreen:

J'espère que l'un de vous aura un peu de temps à me consacrer pour me rédiger un bout de script qui fonctionne.

Merci à tous

hilow a écrit :Salut. J'ai un peu de temps ce matin (c'est rare), alors un petit peu d'aide... Alors, il faut que tu y ailles progressivement. Si tu ne sais rien de la programmation ni de la structure d'une page web, il me semble que deux trois bases te seront essentielles. Alors, vite fait, simplifié et en prenant de gros raccourcis :

1) Une page web (au format HTML) est une suite d'éléments hiérarchisés (on appelle ça le DOM pour Document Object Model). Chaque élément est ce que tu verras appelé "balise" (tag en anglais) sur les sites qui te parlent HTML. La plupart du temps (mais pas toujours donc), une balise est en fait un bloc ayant cette forme : <balise-de-debut>du-contenu</balise-de-fin>. Aussi, chaque balise peut être personnalisée par des attributs, ce qui sur notre modèle donne quelque chose comme : <balise-de-debut attribut-couleur=la-couleur attribut-largeur=la-largeur ...>du-contenu</balise-de-fin>.

A noter un attribut "spécial" du nom de "style" qui peut contenir une somme considérable d'informations, mais c'est une autre histoire. Je ne complique pas inutilement.

2) La première des choses à faire lorsque tu veux analyser quelque chose à l'intérieur de ta page web est donc d'extraire l'élément qui t'intéresse. Dans la logique du DOM et vu d'AutoIt, un élément est un objet (le mot "élement" n'est donc pas à utiliser pour désigner n'importe quoi : du texte dans une page HTML, par exemple, n'est pas un objet, mais le tag qui le contient, oui). Il suffit donc que tu cherches dans la doc d'AutoIt la fonction qui va te permettre de récupérer l'élément que tu veux (regarde par exemple IE.au3 et la rubrique "IE Management" dans l'aide d'AutoIt si tu t'intéresses à Internet Explorer) Une fois que tu as ton élément, tu peux extraire la valeur d'un attribut particulier ou le contenu entre les deux tags de fin et début.

Exercice : afficher la largeur de l'élément de type DIV identifié en tant que "lavabo" dans cette page :

Code : Tout sélectionner

<html><body><div id="lavabo" width="400px">des trucs et des machins</div></body></html>
Tu peux, par exemple, aller voir la fonction _IEGetObjById, mais j'ai rien dit :wink:

Voilà ! Pas de code pour que tu y réfléchisses. On gagne toujours du temps à ne pas sauter les étapes

Merci pour ta réponse hilow, je ne suis pas un novice en html, étant un webdesigner ( lavabo :lol: ). Côté autoit, je ne suis pas un débutant total, je dois avoir une centaine de petits script à mon actif, tous très simples cependant. Mais j'avoue que tout ce qui touche aux fonctions IE ça me dépasse :/

J'ai essayé la fonction _IEGetObjById, mais celle-ci ouvre la page html avant de récupérer les données, j'aimerai que le procédé se fasse " en cachette " si toutefois c'est réalisable.

Que penses-tu de ce bout de code glané sur le site US:

Code : Tout sélectionner

Func _StringBetween2($s, $from, $to)     
$x = StringInStr($s, $from) + StringLen($from)     
$y = StringInStr(StringTrimLeft($s, $x), $to)     
Return StringMid($s, $x, $y)
EndFunc  

$THOTTBOT = _INetGetSource("Http://www.thottbot.com/")
$String = _StringBetween2($THOTTBOT, "<Title>", "</Title>")
MsgBox(1, "ThottBot.com", $String)

 
Merci :)

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 17:42
par mikell
EvilRyu a écrit :J'essaie depuis quelques jours d'extraire un élément d'une page html, un chiffre ou une phrase
Gné Image
C'est vachement précis ça comme demande
Un exemple de page avec élément à extraire peut-être ? pliz ?
Sinon, à question floue, réponse floue ...

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 18:13
par EvilRyu
mikell a écrit :
EvilRyu a écrit :J'essaie depuis quelques jours d'extraire un élément d'une page html, un chiffre ou une phrase
Gné Image
C'est vachement précis ça comme demande
Un exemple de page avec élément à extraire peut-être ? pliz ?
Salut mikell :)

Boh c'est assez précis pourtant :lol: , alors pour exemple j'ai choisi cette page:

http://www.guy4game.com/star-wars-eu/sw ... ter-Empire dans laquelle j'aimerai par exemple extraire: "30.49", puis l'afficher dans une msgbox. ( oui je sais, je suis passé à une page php maintenant pour corser l'affaire :mrgreen: )

En espérant avoir été plus clair qu'au départ...

merci :)

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 18:14
par PandiPanda
ca devrai deja vous mettre sur la voie non? ^^
► Afficher le texte

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 18:22
par EvilRyu
Merci pour l'astuce PandiPanda, mais entre temps j'ai avancé de mon coté ( ça se rapproche pas mal de votre solution car utilisant le _INetGetSource).

J'ai changé de site exemple, car j'ai encore corsé le truc.

voici le nouveau site: http://www.guy4game.com/star-wars-eu/sw ... ter-Empire
J'aimerai extraire le nombre "30.49" et le placer dans une msgbox.


En fait il me manquait un include au début du script, raison pour laquelle il ne marchait pas. Voici donc le script actuel:

Code : Tout sélectionner

#include <Inet.au3>

Func _StringBetween2($s, $from, $to)    
$x = StringInStr($s, $from) + StringLen($from)    
$y = StringInStr(StringTrimLeft($s, $x), $to)    
Return StringMid($s, $x, $y)
EndFunc  

$WEB = _INetGetSource("http://www.guy4game.com/star-wars-eu/swtor-credits/catgory.php?cat=Huntmaster-Empire")
$String = _StringBetween2($WEB, '<span class="price">', "</span>")
MsgBox(1, "Valeur", $String)

 
Seulement problème, en utilisant les balises span comme marqueur, le script me sort le premier nombre de la liste, à savoir 15.39. J'aimerai avoir une astuce qui me permette de dire au script de skip les 2 premiers span, ou toute autre solution pour arriver à mes fins :)

Merci

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 18:23
par PandiPanda
ceci? ^^
il vous suffit de parcourir le tableau et de choisir celui que vous voulez
► Afficher le texte

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 18:23
par mikell

Code : Tout sélectionner

$code = BinaryToString(InetRead('http://www.guy4game.com/star-wars-eu/swtor-credits/catgory.php?cat=Huntmaster-Empire'), 4)
$txt = StringRegExpReplace($code, '(?s)(.+?)1000K([^\$]+)\$(.*?)\s(.+)', "$3")
Msgbox(0,"", $txt)

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 18:42
par EvilRyu
Merci c'est excellent, j'aimerai comprendre la totalité du script, surtout la partie (?s)(.+?)1000K([^\$]+)\$(.*?)\s(.+)', "$3"). Pourriez vous m'expliquer svp? :oops:

Merci aussi PandiPanda, ce script me servira surement pour un autre truc en cours :mrgreen: mais pour l'instant ce n'est pas sous cette forme que je voulais le résultat :)

Re: [..] Extraire un élément d'une page web

Posté : mar. 01 mai 2012 19:19
par mikell
Hum là faudrait voir le fichier d'aide... mais je vais essayer
Accroche-toi :mrgreen:

Le but est d'isoler une string dans un texte
Cette string est limitée d'un côté par le caractère $ , de l'autre par un espace, donc je dis à la fonction :

Dans ce texte où il y a des renvois à la ligne (?s) relève tout ce qu'il y a jusqu'à 1000K (.+?)1000K puis relève tout ce qui n'est pas du caractère dollar $ ([^\$]+) puis relève tout ce qu'il y a entre le caractère $ et le prochain espace ou renvoi à la ligne \$(.*?)\s puis enfin ce qui reste (.+) , et remplace tout ça dans $code par juste le 3ème relevé $3 qui correspond au groupe (.*?) et qui contient ce qui m'intéresse

Tu y es ? Image

On aurait pu aussi lui dire de ne mémoriser que ce qui est intéressant, en l'écrivant comme ça :

Code : Tout sélectionner

$txt = StringRegExpReplace($code, '(?s)(?:.+?)1000K(?:[^$]+)\$([^\s]+)(?:.+)', "$1")

Re: [..] Extraire un élément d'une page web

Posté : mer. 02 mai 2012 07:42
par EvilRyu
Parfait, merci beaucoup :wink: