Page 1 sur 2

[R] StringRegExp simple qui ne fonctionne pas

Posté : mar. 01 juil. 2014 21:50
par Utilisateur 3309 supprimé
Bonjour,
j'essaie de récupérer les noms des sociétés issues de cette page HTML:
http://www.pagespro.com/resultats/trans ... e-du-beton

j'ai déjà fait plein de programmes avec StringRegExp sans aucun problème, et la je ne vois vraiment pas pourquoi je ne récupère rien du tout...
il y a 10 résultats dans la page, et le nom de la société se trouve entre les 2 balises HTML:
<span itemprop="name"> et </span>

Quelqu'un peut-il m'eclairer ???
Merci

Code : Tout sélectionner

#include <IE.au3>

Local $oIE = _IECreate("http://www.pagespro.com/resultats/transport-et-mise-en-oeuvre-du-beton")
Local $sHTML = _IEBodyReadHTML($oIE)
$res = StringRegExp($sHTML, '<span itemprop="name">(.*)</span>', 3)
_IEQuit($oIE)

if ubound($res)>0 then
    msgbox (0,"Résultat","Trouvé = " & ubound($res))
Else
    msgbox (0,"Résultat","Rien trouvé")
EndIf

Re: [..] StringRegExp simple qui ne fonctionne pas

Posté : mar. 01 juil. 2014 22:27
par mikell
Attention aux retours à la ligne

Code : Tout sélectionner

<span itemprop="name">
        Bécome     &nbsp;(SA)      </span>
Utilise Inet plutôt que IE, et "if IsArray($res) then"

Code : Tout sélectionner

#Include <Array.au3>

$txt = BinaryToString(InetRead("http://www.pagespro.com/resultats/transport-et-mise-en-oeuvre-du-beton"))
$res = StringRegExp($txt, '(?s)<span itemprop="name">\s*(.*?)\s*</span>', 3)

if IsArray($res) then
    For $i = 0 to ubound($res)-1
      $res[$i] = StringRegExpReplace($res[$i], '\h*&nbsp;', " ")
   Next
    _ArrayDisplay($res)
  ;  msgbox (0,"Résultat","Trouvé = " & ubound($res))
Else
    msgbox (0,"Résultat","Rien trouvé")
EndIf

Re: [..] StringRegExp simple qui ne fonctionne pas

Posté : mar. 01 juil. 2014 23:17
par Utilisateur 3309 supprimé
Super ca marche ! :wink:
mikell a écrit : Utilise Inet plutôt que IE, et "if IsArray($res) then"
peux-tu expliquer STP pourquoi ? c'est plus rapide ?

Re: [..] StringRegExp simple qui ne fonctionne pas

Posté : mer. 02 juil. 2014 09:27
par mikell
Si tu tries le contenu de ta page au regex INet est beaucoup plus rapide pour récupérer le code source, et plus léger puisque tu n'as pas à lancer IE
Choisir les fonctions _IE* c'est choisir une solution plus lourde et plus lente mais plus sûre, qui te met davantage à l'abri de certaines variations éventuelles dans le code source

Code : Tout sélectionner

#include <IE.au3>

Local $oIE = _IECreate("http://www.pagespro.com/resultats/transport-et-mise-en-oeuvre-du-beton")
$oSpans = _IETagNameGetCollection($oIE, "span")
Local $txt
For $oSpan in $oSpans
    If $oSpan.getattribute("itemprop") = "name" Then $txt &= $oSpan.innertext & @crlf
Next
_IEQuit($oIE)
msgbox (0,"Résultat",$txt)

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : mer. 02 juil. 2014 11:11
par Utilisateur 3309 supprimé
OK j'ai compris pour INET 8)
et pour ce qui est du "if IsArray($res) then" par rapport à "if ubound($res)>0 then" ??

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : mer. 02 juil. 2014 14:25
par mikell
ça dépend de ce que tu veux vérifier (erreur ou array vide)
Dans ce cas pour un résultat de regex il se trouve que ça revient au même, mais sinon un UBound($res)=0 ne veut pas forcément dire erreur d'array

Code : Tout sélectionner

Dim $res[0]
Msgbox(0,"", Execute(IsArray($res)=1))
Msgbox(0,"", Execute(UBound($res)>0))

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : mer. 02 juil. 2014 16:46
par Utilisateur 3309 supprimé
c'est compris, merci pour l'aide ! 8)

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : ven. 18 juil. 2014 09:47
par Utilisateur 3309 supprimé
Mikell, j'essaie le code ci-dessous et je ne comprends pas pourquoi mais il fonctionne 1x sur 10...
la 1ere fois il marche, je click OK dans le msgbox puis je relance le script et là j'ai une erreur:
Image

j'ai remarqué que quand j'ai un Internet explorer d'ouvert je n'ai pas d'erreur. par contre quand je n'ai aucune fenêtre internet explorer d'ouvert, j'ai le message d'erreur dès la 2eme lancement du script et l'erreur apparait sans que la page internet n'ai été ouverte...

J'utilise la version du 3.3.12 du pack FR de Tlem, et je viens d'installer la dernière beta d'autoit et le problème apparait toujours...
je ne comprends pas pourquoi il y a cette erreur aléatoire...

Code : Tout sélectionner

#include <IE.au3>

Local $oIE = _IECreate("http://www.pagespro.com/resultats/transport-et-mise-en-oeuvre-du-beton")
$oSpans = _IETagNameGetCollection($oIE, "span")
Local $txt
For $oSpan in $oSpans
    If $oSpan.getattribute("itemprop") = "name" Then $txt &= $oSpan.innertext & @crlf
Next
_IEQuit($oIE)
msgbox (0,"Résultat",$txt)

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : ven. 18 juil. 2014 13:35
par mikell
Ah les humeurs de IE :roll:
Essaie ProcessClose("iexplore.exe") en fin de script

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : ven. 18 juil. 2014 14:20
par Utilisateur 3309 supprimé
ca marche ! merci !
par contre quand j'ouvre internet explorer après ca, j'ai droit a un message comme quoi IE ne s'est pas fermé correctement et si je veux restaurer la session. donc ca marche mais on a vu "plus propre" lol :lol:

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : ven. 18 juil. 2014 14:57
par orax
Je ne comprends pas le processClose(). L'erreur se produit avant.
► Afficher le texte

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : ven. 18 juil. 2014 20:15
par mikell
orax a écrit :Je ne comprends pas le processClose()
orax, je vais être parfaitement honnête avec toi : moi non plus :mrgreen:

J'avais peu de temps entre midi et 2 alors j'ai raisonné de manière bassement empirique en me basant sur le message de cetipabo :
"j'ai remarqué que quand j'ai un Internet explorer d'ouvert je n'ai pas d'erreur"
"j'ai le message d'erreur dès la 2eme lancement du script"
"l'erreur apparait sans que la page internet n'ai été ouverte"

Tout ça sent le processus mal refermé, mais pas moyen de tester avec mes XP et IE 8 vu que le code fonctionnait sans pb chez moi ^^

@cetipabo
Je suis d'accord c'est pas très propre... elle te plait pas ma solution d'avant avec InetRead ?

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : sam. 19 juil. 2014 17:39
par Utilisateur 3309 supprimé
les 2 solutions me plaisent. la 1ere parce qu'elle marche parfaitement. la 2eme parce qu'elle est tres interessante et j'étaits justement en train de l'étudier mais avec ces erreurs étranges ca saoul un peu...

@orax
j'ai essayé ton script, mais j'ai systematiquement le message d'erreur "impossible de récupéré les éléments sur la page".
la 1ere fois IE s'ouvre, puis j'ai le message d'erreur. et ensuite j'ai le message d'erreur sans qu'IE ne s'ouvre...

Je suis sous WIN7 64 avec IE11 à jour.

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : sam. 19 juil. 2014 18:21
par orax
C'est normal, j'avais piégé mon code ! J'avais laissé un SetError(1). Mais ce n'était pas volontaire, c'était pour tester un truc et j'avais complètement oublié de l'enlever ! Image
J'ai modifié mon code.

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : sam. 19 juil. 2014 19:28
par mikell
cetipabo a écrit :... et ensuite j'ai le message d'erreur sans qu'IE ne s'ouvre
Hum hum... :mrgreen:

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : dim. 20 juil. 2014 20:51
par Utilisateur 3309 supprimé
ben avec le code modifié j'ai:
erreur: 3
extended : 1

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : dim. 20 juil. 2014 21:41
par mikell
[mode pure curiosité malsaine ON]
Tu pourrais essayer de rajouter ça juste sous le _IECreate ?

Code : Tout sélectionner

While $oIE.Busy
   Sleep(10)
Wend

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : lun. 21 juil. 2014 10:58
par Utilisateur 3309 supprimé
ok je fais ca dès que je suis chez mio.

Par contre avez vous pu reproduire le problème chez vous ? ou je suis le seul ?

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : lun. 21 juil. 2014 21:20
par Utilisateur 3309 supprimé
mikell a écrit :[mode pure curiosité malsaine ON]
Tu pourrais essayer de rajouter ça juste sous le _IECreate ?

Code : Tout sélectionner

While $oIE.Busy
   Sleep(10)
Wend
Au 1er coup ca marche, ensuite j'ai cette erreur systématique:

Image

si j'attend 30 secondes et que je relance le script ca marche...sinon même erreur à chaque fois, c'est fou ça !!

Re: [R] StringRegExp simple qui ne fonctionne pas

Posté : lun. 21 juil. 2014 22:20
par mikell
Arf
OK ça se précise, autre essai : mettre ça en tout début de script (juste sous l'include)

Code : Tout sélectionner

While ProcessExists("iexplore.exe")
   Sleep(10)
Wend