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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
EvilRyu
Niveau 2
Niveau 2
Messages : 28
Enregistré le : dim. 28 déc. 2008 18:16
Status : Hors ligne

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

#1

Message 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 :)
Modifié en dernier par EvilRyu le mer. 02 mai 2012 05:06, modifié 1 fois.
Image
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#2

Message 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 ...
Modifié en dernier par mikell le mar. 01 mai 2012 17:49, modifié 1 fois.
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
EvilRyu
Niveau 2
Niveau 2
Messages : 28
Enregistré le : dim. 28 déc. 2008 18:16
Status : Hors ligne

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

#3

Message 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 :)
Modifié en dernier par EvilRyu le mar. 01 mai 2012 18:17, modifié 2 fois.
Image
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#4

Message par PandiPanda »

ca devrai deja vous mettre sur la voie non? ^^
► Afficher le texte
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
EvilRyu
Niveau 2
Niveau 2
Messages : 28
Enregistré le : dim. 28 déc. 2008 18:16
Status : Hors ligne

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

#5

Message 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
Image
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#6

Message par PandiPanda »

ceci? ^^
il vous suffit de parcourir le tableau et de choisir celui que vous voulez
► Afficher le texte
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#7

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
EvilRyu
Niveau 2
Niveau 2
Messages : 28
Enregistré le : dim. 28 déc. 2008 18:16
Status : Hors ligne

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

#8

Message 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 :)
Image
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#9

Message 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")
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
EvilRyu
Niveau 2
Niveau 2
Messages : 28
Enregistré le : dim. 28 déc. 2008 18:16
Status : Hors ligne

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

#10

Message par EvilRyu »

Parfait, merci beaucoup :wink:
Image
Répondre