Coger enlace segun estado de una imagen

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Coger enlace segun estado de una imagen

Mensaje por pako »

Hola a todos,
Espero explicarme bien, lo que intento hacer es coger los <h4> que hay dentro de un <div> y mostrarlos
en un cuadro de texto a aparte.

Código: Seleccionar todo


<div class="list">

<h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4>

<h4><img..........



 
y dependiendo del dia, hay mas o menos <h4> en la pagina

Una vez que cojo todos los <h4>, solo quiero ir a los enlaces que cumplan con el requisito de que la imagen coincida con "imagen/listo.png".

Espero que se me entienda....soy un pelin torpe...jejejejee

saludos cordiales
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Una pregunta, "imagen/listo.png" esta parte del código cambia en cada imagen o es siempre la misma? Porque si es siempre la misma directamente puedes filtrar los links gracias a esta parte del código, sin necesidad de hacer un filtrado inicial de las etiquetas <h4>.

Igualmente te recomiendo que mires en la ayuda las funciones _IELinkGetCollection para capturar todos los links de una página, StringRegExp para filtrar los links resultantes según el texto (o para filtrar lo que quieras del código html), y si no te aclaras con esta última, mira _StringBetween que es más facil de utilizar. Esta función te da una cadena de texto que esté entre una cadena inicial y otra final.

Yo creo que con eso lo haces perfectamente.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

hola Chefito

Primero, gracias por responder.

En efecto "imgen/listo.png" cambia entre dos valores, listo.png, error.png.
Los enlaces los cojo sin problema alguno, pero loq ue me interesa es cojer solo los enlaces cuando la imagen es "listo.png" y no "error.png", por eso habia pensado en "recoger" solo los <h4> y luego filtrar los links.

Me preguntaba si con _Ietagnamegetcollection se podria hacer lo de "recoger" solo los <h4> ???
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Esto te tendría que valer.
Donde pone "www.paginaweb.com" pon la página donde están los enlaces.
He recorrido todos los enlaces de la página, y he puesto una condición diciendo que si el texto del enlace contiene la cadena "imgen/listo.png" que se almacene en la variable $todoslinks. Tu pon lo que quieras.
No lo he probado. Supongo que irá.

Código: Seleccionar todo

#include <IE.au3>

Dim $TodosLinks=""

$oIE = _IE_Example ("www.paginaweb.com")

$oLinks = _IELinkGetCollection ($oIE)

$iNumLinks = @extended

For $oLink In $oLinks

    If StringInStr($oLink.href,"imgen/listo.png")<>0 Then

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $TodosLinks=$TodosLinks & $oLink.href & @CRLF

    EndIf

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Algo asi ya lo he probado, pero no sirve porque la imagen no pertenece al enlace, por eso queria saber si se puede hacer lo de "recoger" los <h4>, al igual que con los enlaces, como indicas en tu codigo.

Código: Seleccionar todo


$links = $oIE.document.links

For $Link In $links

    $linkURL = $Link.href

    if StringRegExp($linkURL,"/images/listo.png") <> 0 then _ArrayAdd($alllinks,$linkURL)

Next



_ArrayDisplay($alllinks)

 
este es la parte de mi codigo( faltan declaraciones de variable y demas...).Es como tu codigo, pero diferente modo.


Saludos
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Bueno, creo que tengo un avance, o eso espero

Código: Seleccionar todo


$oElements = _IETagNameAllGetCollection ($oIE)

For $oElement In $oElements

   ; MsgBox(0, "Element Info", "Tagname: " & $oElement.tagname & @CR & "innerText: " & $oElement.innerText)

    if $oElement.tagname = "H4" then MsgBox(-1,"",$oElement.innerhtml)

Next

 
Con eso consigo coger todo lo que hay dentro de la etiqueta <H4>

Ya ire posteando los pasitos que de....

Un saludo
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Perdon perdon perdon, leí mal y confundí la propiedad del objeto. Prueba esto:

Código: Seleccionar todo

#include <IE.au3>

Dim $TodosLinks=""

$oIE = _IE_Example ("www.paginaweb.com")

$oLinks = _IELinkGetCollection ($oIE)

$iNumLinks = @extended

For $oLink In $oLinks

    If StringInStr($oLink.src,"imgen/listo.png")<>0 Then

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $TodosLinks=$TodosLinks & $oLink.href & @CRLF

    EndIf

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Chefito escribió:Perdon perdon perdon, leí mal y confundí la propiedad del objeto. Prueba esto:

Código: Seleccionar todo

#include <IE.au3>

Dim $TodosLinks=""

$oIE = _IE_Example ("www.paginaweb.com")

$oLinks = _IELinkGetCollection ($oIE)

$iNumLinks = @extended

For $oLink In $oLinks

    If StringInStr($oLink.src,"imgen/listo.png")<>0 Then

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $TodosLinks=$TodosLinks & $oLink.href & @CRLF

    EndIf

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)
Saludos.
Hola otra vez,
Este ultimo codigo da error, porque no hay ninguna imagen asociada al link. Este codigo que me facilitas seria para el caso
de poder clickear sobre la imagen e ir al enlace asociado ( espero no meter la pata...)

Código: Seleccionar todo


<h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4>



<h4>

 
Si te fijas, la imagen esta fuera del "tag" <a> que encierra el enlace
Tu codigo serviria para algo como esto:

Código: Seleccionar todo


<a href="http://sitiox.com"><img src="images/logo.png" alt="" id="sitelogo" /></a>

 
Sigo dandole vueltas al tema, ya pondre mis avances, si es que consigo algo... :smt001

Gracias por tu interes

Saludos
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Jajajaja....eso me pasa por ir a toda leche :smt005 . Perdona por los errores. Menos mal que te has dado cuenta y no te he vuelto loco :smt002 .
Además, mirando el código me he dado cuenta que hasta he puesto _IE_Example en vez de _IECreate .... jajajaja :smt005 .

Ahora me he tomado algo más de tiempo (no quería fallar más y hacer el ridículo :smt003 ) y creo que ya tengo el código. Mete la tu página web al principio y pruebalo. Al ver que estaban los objetos separados, he optado por el primer consejo que te dí, utilizar expresiones regulares.

Código: Seleccionar todo

#include <IE.au3>

Dim $TodosLinks=""

Local $oIE = _IECreate("www.paginaweb.com")

Local $TextHtml=_IEDocReadHTML($oIE)

$vectorH4=StringRegExp($TextHtml,'<(?i)h4>(.*?)</(?i)h4>', 3)

For $n=0 To UBound($vectorH4)-1

    If StringInStr($vectorH4[$n],"imagen/listo.png")<>0 Then

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $LinksBueno=StringRegExp($vectorH4[$n],'<a href="(.*?)"',1)

        $TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF

    EndIf

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)

 
Espero que sea el definitivo :smt005 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Hola de nuevo,

Pues no se porque, pero se produce algun tipo de error y el autoit se sale.

P.D : Ahora se complica la cosa, porque la maldita web que uso como ejemplo no deja usar el IE. Han modificado algo y sale una bonita pagina indicando que no esta optimizada para IE, y se queda ahi. Asi que ahora estoy buscando informacion sobre el UDF FF.au3.....................esta interesante...

De todos modos seguire intentando hacerlo correr en otra web, que coincida con los requisitos. Segun consiga, ire posteando los codigos.


Un saludo :smt006

CHEFITO: Tu no duermes???? jajajajajajaja
Muchas gracias por tu tiempo
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Mmmmm.....que raro. Lo probé con un texto y parecía que funcionaba. No se no se.
Recuerda que hay otras formas de conseguir el código html para luego tratarlo. Por ejemplo con _INetGetSource.
Si pones la página te ayudaremos mejor.....así vamos un poco a ciegas.

Por cierto, sí, a veces duermo, y trabajo, y veo la tv, a veces estudio, y hasta a veces tengo tiempo para hacer algo de deporte e ir con la novia. Jajajajaja......pero solo a veces :smt005 . Ahora mismo tengo unos días de vacaciones que me debían, por eso tengo más tiempo :smt002 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Código: Seleccionar todo


#include <IE.au3>

#include <Array.au3>

Dim $TodosLinks=""

;dim $LinksBueno="" ;lo he añadido yo pero sigue con el error

Local $oIE = _IECreate("http://wavebux.com/ads.php")



Local $TextHtml=_IEDocReadHTML($oIE)

;MsgBox(-1,"",$TextHtml)

$vectorH4=StringRegExp($TextHtml,'<(?i)h4>(.*?)</(?i)h4>', 3)



_ArrayDisplay($vectorH4) ; lo he añadido para comprobar QUE SI FUNCIONA tu regexp 



For $n=0 To UBound($vectorH4)-1



    If StringInStr($vectorH4[$n],"ad_new.png") Then



       



        $LinksBueno=StringRegExp($vectorH4[$n],'<a href="(.*?)"',1)



        $TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF ; y aqui sale el error



    EndIf



Next



MsgBox(0,"Liks imgen/listo.png",$TodosLinks)



 
El error es el siguiente

Código: Seleccionar todo


D:\Documents and Settings\paco\My Documents\aaa.au3 (21) : ==> Subscript used with non-Array variable.:

$TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF

$TodosLinks=$TodosLinks & $LinksBueno^ ERROR

 
Si en la linea :

$TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF ;

pones:
$TodosLinks=$TodosLinks & $LinksBueno & @CRLF ;

No da el error y la msgbox arroja cuatro 0

Bueno, ya me contaras.....

Yo sigo investigando
Un saludo
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Pues no se chico. Mira, te dejo el código con una prueba en un texto:

Código: Seleccionar todo

#include <IE.au3>

Dim $TodosLinks=""

;~ Local $oIE = _IECreate("www.paginaweb.com")

;~ Local $TextHtml=_IEDocReadHTML($oIE)

$TextHtml='<h4><img src="http://paginaejemplo.com/imagen/malo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4><h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a><H4><h4>hola</h4><h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4><h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4>'

$vectorH4=StringRegExp($TextHtml,'<(?i)h4>(.*?)</(?i)h4>', 3)

For $n=0 To UBound($vectorH4)-1

    If StringInStr($vectorH4[$n],"imagen/listo.png")<>0 Then

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $LinksBueno=StringRegExp($vectorH4[$n],'<a href="(.*?)"',1)

        $TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF

    EndIf

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)

 
No tengo ni idea porque te dice eso. Te llega bien el texto html? Dices que te llegan bien los primeros bloques (el vector $vectorH4)??? No se no se.
Prueba con la función _StringBetween:

Código: Seleccionar todo

#include <IE.au3>

#Include <string.au3>

Dim $TodosLinks=""

Local $oIE = _IECreate("www.paginaweb.com")

Local $TextHtml=_IEDocReadHTML($oIE)

$vectorH4=_StringBetween($TextHtml,"<h4>","</h4>")

For $n=0 To UBound($vectorH4)-1

    If StringInStr($vectorH4[$n],"imagen/listo.png")<>0 Then

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $LinksBueno=_StringBetween($vectorH4[$n],'<a href="','"')

        $TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF

    EndIf

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)

 
Si te falla todo esto tendría que saber la página para poder seguir probando. Así sin nada no se me ocurre más, ya que con los datos que tengo a mí me va.
O por lo menos saber el código html que te recupera.
Si no me das nada de eso mi ayuda se acaba aquí :smt012 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Hola
A ver, tu codigo funciona a la perfeccion cuando usas texthtml como una cadena definida...pero cuando viene del codigo de la pagina web, da el error de las narices.....por lo menos a mi autoit :smt011

Este es el codigo con la web en particular:

Código: Seleccionar todo


#include <IE.au3>

#include <array.au3>

Dim $TodosLinks=""



 Local $oIE = _IECreate("http://wavebux.com/ads.php")



 Local $TextHtml=_IEDocReadHTML($oIE)



;$TextHtml='<h4><img src="http://paginaejemplo.com/imagen/malo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4><h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a><H4><h4>hola</h4><h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4><h4><img src="http://paginaejemplo.com/imagen/listo.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://paginaejemplo.com/link.php?a=332167518590a6a0f4f62d3d34dcf82e" > Promotions</a></h4>'



$vectorH4=StringRegExp($TextHtml,'<(?i)h4>(.*?)</(?i)h4>', 3)

_ArrayDisplay($vectorH4)

For $n=0 To UBound($vectorH4)-1



    If StringInStr($vectorH4[$n],"images/ad_new.png")<>0 Then



        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.



        $LinksBueno=StringRegExp($vectorH4[$n],'<a href="(.*?)"',1)



        $TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF



    EndIf



Next



MsgBox(0,"Liks imgen/listo.png",$TodosLinks)

 
Solo he comentado el texthtml y lo he cogido de la web.
Prueba a ver que te sucede, si te da el error o es solo a mi.......
Gracias y un saludo
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Coger enlace segun estado de una imagen

Mensaje por Chefito »

Menos mal que te decides aponerme la página web. Gracias ha eso ya se que pasa con el código :smt002 .
Pues resulta que los últimos códigos están bien. Y te preguntarás, por que no funcionan? Sí funcionan, lo que pasa que por alguna causa no encuentran lo que quieres. Que tienes que hacer en estos casos? tienes que ver que código html te devuelve el script.
Pues bien, lo miré y resulta que te devuelve el código un poquitín cambiado con el que se genera cuando entrar tú directamente a la página. Por esta causa no coinciden las expresiones a buscar y por eso no encuentra nada.
Un ejemplo: el código html en la página cargada por tí te devuelve esto:
<h4><img src="http://wavebux.com/images/ad_new.png" id="332167518590a6a0f4f62d3d34dcf82e" /> <a href="http://wavebux.com/view.php?ad=33216751 ... 3d34dcf82e" onclick="ClickAd('332167518590a6a0f4f62d3d34dcf82e')" target="_blank">WaveBux Contests & Promotions</a></h4>
<p></p>
En cambio el código html que te devuelve el script es así:
<H4><IMG id=332167518590a6a0f4f62d3d34dcf82e src="http://wavebux.com/images/ad_new.png"> <A onclick="ClickAd('332167518590a6a0f4f62d3d34dcf82e')" href="http://wavebux.com/view.php?ad=33216751 ... 3d34dcf82e" target=_blank>WaveBux Contests & Promotions</A></H4>
Te das cuenta del problema?? El problema está en que nosotros poníamos

Código: Seleccionar todo

$LinksBueno=StringRegExp($vectorH4[$n],'<a href="(.*?)"',1)
cuando debería ser

Código: Seleccionar todo

$LinksBueno=StringRegExp($vectorH4[$n],'href="(.*?)"',1)
Observa lo anterior y verás :smt003 .
Cambiando simplemente eso en cualquiera de los dos script (el de expresiones regulares o el de _StringBetween, funcionan perfectamente.
La verdad es que una cosa así te puede volver loco, porque, a que cuento te cambia eso? No lo se ni lo voy a investigar.......paso :smt005 .

Pero al tener el código a la vista he pensado que se puede mejorar el script. Por que coger todos los links.....los malos y los buenos para luego tener que compararlos y buscar los buenos???. Se puede optimizar el código haciendo una expresión regular mejor para que solo coja los buenos y luego solo tendrás que mostrarlos con un for....next, sin tener que hacer una condición con StringInStr:

Código: Seleccionar todo

#include <IE.au3>

#include <array.au3>

Dim $TodosLinks=""

Local $oIE = _IECreate("http://wavebux.com/ads.php")

Local $TextHtml=_IEDocReadHTML($oIE)

$vectorH4=StringRegExp($TextHtml,'(?i)src="http://wavebux.com/images/ad_new.png"(.*?)</h4>', 3)

For $n=0 To UBound($vectorH4)-1

        ;aquí pon lo que quieras hacer con esos enlaces. Yo te los voy a almacenar en una variable para luego mostrarlos.

        $LinksBueno=StringRegExp($vectorH4[$n],'href="(.*?)"',1)

        $TodosLinks=$TodosLinks & $LinksBueno[0] & @CRLF

Next

MsgBox(0,"Liks imgen/listo.png",$TodosLinks)

 
La próxima vez ya sabes lo que tienes que hacer para no volvernos locos, darnos toda la información necesaria desde el principio.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
pako
Mensajes: 14
Registrado: 01 Feb 2008, 23:14

Re: Coger enlace segun estado de una imagen

Mensaje por pako »

Hola,
Porque no te tengo al lado, que si no te daba dos besos (sin mariconás,eh?)
Eres un genio

Muchas gracias por tu paciencia y tiempo, de verdad.

Saludos figura
Responder