Page 1 sur 1

[R] InetGetSource et les Regex

Posté : jeu. 21 juil. 2011 22:52
par aurel2108
Bonjour à tous,

Voilà, je voudrais faire un petit programme de traduction utilisant Google Translate.
Malheureusement, Google va fermer son API et j'ai donc décidé de passer directement par la page web.
Néanmoins, je suis confronté à ce problème :

Code : Tout sélectionner

#include <Array.au3>
#include <inet.au3>

$source = _INetGetSource("http://translate.google.com/translate_t?hl=&ie=UTF-8&text=test&sl=auto&tl=es")
$resultat = StringRegExp($source, '<span id=result_box class="short_text"><span title="(.*?)" onmouseover="this.style.backgroundColor=' & "'#ebeff9'" & ' onmouseout="this.style.backgroundColor=' & "'#fff'" & '>(.*?)</span></span>', 1)
_ArrayDisplay($resultat)
 
ne fonctionne pas (n'affiche même pas la fenêtre _ArrayDisplay) tandis que :

Code : Tout sélectionner

#include <Array.au3>

$source = '<span id=result_box class="short_text"><span title="test" onmouseover="this.style.backgroundColor=' & "'#ebeff9'" & ' onmouseout="this.style.backgroundColor=' & "'#fff'" & '>test</span>'
$resultat = StringRegExp($source, '<span id=result_box class="short_text"><span title="(.*?)" onmouseover="this.style.backgroundColor=' & "'#ebeff9'" & ' onmouseout="this.style.backgroundColor=' & "'#fff'" & '>(.*?)</span>', 1)
_ArrayDisplay($resultat)
 
Fonctionne.

Je pense donc que cela vient de la fonction InetGetSource mais je ne trouve pas l'erreur.
En effet, INetGetSource me renvoie bien la source et ma regex est correcte.

Merci d'avance de bien vouloir m'aider.

Re: [..] InetGetSource et les Regex

Posté : jeu. 21 juil. 2011 23:08
par Iste
Testez manuellement le code renvoyé par _INetGetSource() et vos regexp.

Il y a de forte chance que la source de la page ne soit pas celle que vous voulez.

Pour avoir un résultat certain, utilisez un objet IE (IE.au3)

Re: [..] InetGetSource et les Regex

Posté : ven. 22 juil. 2011 00:07
par aurel2108
En effet, je vais tester si le code source récupéré est correct à ma regex.
Cependant, est-il possible de récupérer le code source avec IE.au3 mais sans ouvrir Internet Explorer ou du moins, sans le voir à l'écran ?

EDIT : Le code récupéré est correct, néanmoins, je n'obtiens toujours rien. :/
Je vais essayer de récupérer le code autrement.
EDIT² : J'ai peut être trouvé, ce serait surement à cause des majuscules.
EDIT 3 : En effet, en modifiant un peu, ça marche avec IE.au3, je cherche toujours pour INetGetSource. :/
EDIT 4 (le dernier) : En bidouillant un chouilla, j'ai trouvé une regex potable pour INetGetSource.

Voilà le code :

Code : Tout sélectionner

#include <Array.au3>

$source = _INetGetSource("http://translate.google.com/translate_t?hl=&ie=UTF-8&text=test&sl=auto&tl=es")
$resultat = StringRegExp($source,'onmouseout="this.style.backgroundColor=(.*?)>(.*?)</span>',2)
MsgBox(0, "Traduction", $resultat[2])
Et veuillez m'excuser du dérangement. :/

Re: [..] InetGetSource et les Regex

Posté : ven. 22 juil. 2011 00:08
par Iste
Vous l'avez peut etre vu, mais oui, IE.au3 permet de travailler de manière caché (voir doc)

Sinon, pour avoir déja essayé de faire un _INetGetSource() sur des pages google, j'ai constaté que, comme d'autre, une grande partie de la page se génère apres chargement (par javascript). Du coup, récupérer la source ne fonctionne pas, il faut simuler l'ouverture de la page.

Re: [R] InetGetSource et les Regex

Posté : ven. 22 juil. 2011 08:55
par timmalos
Je vous conseillerai également de ne pas inclure <Inet.au3> Pour simplement 4 lignes :
Un simple InetRead et BinaryToString suffit ici ;)

Code : Tout sélectionner

Func _INetGetSource($s_URL, $bString = True)
    Local $sString = InetRead($s_URL, 1)
    Local $nError = @error, $nExtended = @extended
    If $bString Then $sString = BinaryToString($sString)
    Return SetError($nError, $nExtended, $sString)
EndFunc   ;==>_INetGetSource