Página 1 de 1

Ayuda con StringRegExp en un codigo html

Publicado: 18 Jun 2010, 19:16
por arkcrew
Hola, buenas

Mi problema, es que la funcion StringRegExp no me funciona adecuadamente.
Estoy tratando de hacer una aplicación que coja el codigo de un post publicado en taringa, tengo el programa casi completo, pero a la hora de sacar el codigo html de lo que viene a ser el post no puedo.

Tengo este codigo:

Código: Seleccionar todo

getcont("http://rss.taringa.net/~r/Taringa/ultimos-post/~3/Y0yHjNucabc/Se-necesitan-dadores-de-sangre-con-urgencia.html"); Mando la url a la funcion
func getcont($url)
$oIE = _IECreate($url,0,0)
_IELoadWait ($oIE)
$var = _IEBodyReadHTML($oIE)
	;Saco el contenido del post
	$a1 = StringReplace($var,'<SPAN property="dc:content" sizcache="0" sizset="32">','<contenido>')
	$a = StringReplace($a1,'<div class="byGoogle footerAds">','</contenido>')
	   $cont = StringRegExp($a, '<(?i)contenido>(.*?)</(?i)contenido>',1,1)
	   for $i = 0 to UBound($cont) - 1
	   msgbox(0,"",$cont[$i])
	  ; return $cont[$i]
  Next
	;Ahora saco las tags:
EndFunc
Utilizo el stringreplace en esas cadenas de texto, ya que son las unicas que estan presentes en todos los post independientemente de su contenido, pero no consigo nada.
Si pruebo con _StringBetWeen, el resultado es 0

¿Alguien me puede ayudar?

Muchas gracias

Re: Ayuda con StringRegExp en un codigo html

Publicado: 21 Jun 2010, 00:33
por Chefito
Prueba capturando los objetos Div y comparando la clase (class) de los mensajes (<div class="comment-content">). El código sería algo así:

Código: Seleccionar todo

#include <IE.au3>
$oIE = _IECreate("http://rss.taringa.net/~r/Taringa/ultimos-post/~3/Y0yHjNucabc/Se-necesitan-dadores-de-sangre-con-urgencia.html")
$oDivs = _IETagNameGetCollection ($oIE, "Div")
For $oDiv In $oDivs
	If $oDiv.classname=="comment-content" Then
		ConsoleWrite($oDiv.innertext &@CR)
	EndIf
Next
Saludos.

Re: Ayuda con StringRegExp en un codigo html

Publicado: 22 Jun 2010, 16:42
por arkcrew
Si, con esto se resuelve uno de mis problemas,que consistia en obtener las tags, pero aun asi, el problema anterior persiste, ya que el mensaje, o post o contenido, como querais llamarlo, no me refiero a los mensajes de los usuarios, sino al tema del autor del post, esta dentro de esta etiqueta:

<span property="dc:content"></span>

Y en AutoIt, no se como leer eso, se podria hacer igual que con las div¿?

Ah, la funcion que me has enviado, podria devolver el codigo html en vez del texto¿?, es que por eso la funcion que yo tenia, utilizaba la funcion _IEBodyReadHTML , para copiar el codigo html del tema.

Gracias por la ayuda!!, espero algun dia llegar a saber tanto como vosotros

Re: Ayuda con StringRegExp en un codigo html

Publicado: 22 Jun 2010, 18:54
por Chefito
Una forma puede ser esta:

Código: Seleccionar todo

#include <INet.au3>
#Include <String.au3>
$html = _INetGetSource("http://rss.taringa.net/~r/Taringa/ultimos-post/~3/Y0yHjNucabc/Se-necesitan-dadores-de-sangre-con-urgencia.html")
$mensaje=_StringBetween($html,'<span property="dc:content">','</span>')
MsgBox(0,"",$mensaje[0])
Mira el código y analízalo ayudandote de la ayuda (redundante :smt005 )

Saludos.

Re: Ayuda con StringRegExp en un codigo html

Publicado: 22 Jun 2010, 19:09
por gna08
el problema es analizar el codigo html desde el navegador. k suele diferir en algunos casos por este medio o la udf ie-..


PD: aguante la web argenta taringa :smt041 :smt041
jaj

Re: Ayuda con StringRegExp en un codigo html

Publicado: 23 Jun 2010, 17:37
por arkcrew
Chefito, tu solución me funciona si la pongo en un script a parte, pero cuando la añado a mi codigo, no me funciona.

Os dejo todo lo que tengo hecho comentado, para que veais como funciona.

Código: Seleccionar todo

;Librerias:
#include <INET.au3>
#include <IE.au3>
#include <String.au3>
#include <Array.au3>
;Defino el host:
Dim $host = "http://rss.taringa.net/Taringa/ultimos-post" ; Url del canal RSS de taringa que contiene los 21 nuevos post

;lanzo la funcion:
getlinks($host)

;Defino las funciones
Func getlinks($host)
$var = _INetGetSource($host) ; Obtengo el codigo fuente del canal rss (que viene a ser un archivo XML)
    $array = StringRegExp($var, '<(?i)link>(.*?)</(?i)link>', 3, 3); Leo el contenido dentro de los valores <link></link>
    for $i = 2 to UBound($array) - 1 ;Empiezo por el dos para comenzar a leer los titulos de los post evitando el titulo de la pagina y cabecera
		TrayTip("Obteniendo datos","Link "& $i &" de " & UBound($array)-1 ,1,1)
		Sleep(100)
		write($array[$i]); Mando a la funcion la url obtenida
Next
EndFunc


Func write($url)
	$title = gettitle($url) ;Obtengo el titulo de la url enviada
	$cont = getcont($url); Obtengo el contenido del POST --> Aqui valor 0 o Error
	msgbox(0,$url,"titulo:"&$title&@lf&"Cnt:"&$cont); Muestro un mensaje con los datos obtenidos
endfunc

func gettitle($url)
$oIE = _IECreate($url,0,0); creo la pagina, ya que la url debe redirigirnos a otra distinta, de la cual debemos obtener el codigo html
_IELoadWait ($oIE);Esperamos a que cargue la página
$var = _IEDocReadHTML($oIE);Obtengo el codigo html de la página
	$title = StringRegExp($var, '<(?i)title>(.*?)</(?i)title>', 1, 1);Saco el contenido dentro de los campos <title></title>
	for $i = 0 to UBound($title) - 1
	TrayTip("",$title[$i],1,1)
	return $title[$i];Devuelv el resultado
Next

EndFunc

func getcont($url)
$oIE = _IECreate($url,0,0)
_IELoadWait ($oIE)
$html = _IEDocReadHTML($oIE)
$mensaje=_StringBetween($html,'<span property="dc:content">','</span>');Leo dentro de estos dos marcos
return $mensaje;Devuelvo el mensaje
EndFunc

func gettags($url) ; Me permite la obtencion de las tags del post para luego ubicarlo en el foro correspondiente
$oIE = _IECreate($url,0,0)
$oDivs = _IETagNameGetCollection ($oIE, "Div")
For $oDiv In $oDivs
   If $oDiv.classname=="tags-block" Then
      ConsoleWrite($oDiv.innertext &@CR)
   EndIf
Next
endfunc
Gracias por todo y espero que haya una solucion para esto...
Un saludo

Re: Ayuda con StringRegExp en un codigo html

Publicado: 23 Jun 2010, 21:25
por Chefito
Por que no te funciona?? Pues porque no te has fijado en el código :smt005 . Simplemente eso.
Has cambiado muy poco el código, pero no lo has hecho bien.
La función _StringBetween si no falla en su búsqueda, devuelve un array con los string que haya encontrado. Ya te dije que lo analizases y mirases la ayuda :smt012 .
Tendrías que devolver $mensaje[0].

Otra cosas, si $mensaje te devuelve 0 es que ha fallado en su búsqueda. He estado probando los links de la página y fallan muchas veces. Incluso muchas veces me cargaba mal la página principal. Creo que esa página no va muy bien :smt021 . O yo no puedo acceder bien desde mi ordenado :smt017 . Pero si tú me dices que $mensaje te da muchas veces 0 malo, mira que se carge bien el link.

Otra cosa, no hace falta cargar varias veces la página de los enlaces. Esto hace perder mucho tiempo, poner más código innecesario y cargar más la conexión. Si vas ha trabajar varias veces con la misma web cargala solamente una vez :smt023 .

Para conseguir el título de la página web puedes utilizar _IEPropertyGet($oIE,"title"). Como ves, esto de ahorra mucho código :smt002 .

He hecho una pequeña adaptación a tu código. A mi no me va bien porque como te he comentado los links apenas se me cargan. Pero supongo que si se cargasen iría bien:

Código: Seleccionar todo

#include <INET.au3>
#include <IE.au3>
#include <String.au3>
;Defino el host:
Dim $host = "http://rss.taringa.net/Taringa/ultimos-post" ; Url del canal RSS de taringa que contiene los 21 nuevos post

;lanzo la funcion:
getlinks($host)

;Defino las funciones
Func getlinks($host)
$var = _INetGetSource($host) ; Obtengo el codigo fuente del canal rss (que viene a ser un archivo XML)
    $array = StringRegExp($var, '<(?i)link>(.*?)</(?i)link>', 3, 3); Leo el contenido dentro de los valores <link></link>
	$TotalLinks=UBound($array) - 1
    for $i = 2 to $TotalLinks ;Empiezo por el dos para comenzar a leer los titulos de los post evitando el titulo de la pagina y cabecera
		TrayTip("Obteniendo datos","Link "& $i-1 &" de " & $TotalLinks-1 ,1,1)
		Sleep(100)
		$oIE = _IECreate($array[$i],0,0); creo la pagina, ya que la url debe redirigirnos a otra distinta, de la cual debemos obtener el codigo html
		$html = _IEDocReadHTML($oIE);Obtengo el codigo html de la página
		$title = _IEPropertyGet($oIE,"title") ;Obtengo el titulo de la url enviada
		$mensaje=_StringBetween($html,'<span property="dc:content">','</span>');Leo dentro de estos dos marcos
		If @error Then
			msgbox(0,"Error en " & $array[$i],"Ha habido un error al cargar la página"); Muestro un mensaje con los datos obtenidos
		Else
			msgbox(0,$array[$i],"titulo:"&$title&@lf&"Cnt:"&$mensaje[0]); Muestro un mensaje con los datos obtenidos
		EndIf
	Next
EndFunc
Saludos.

Re: Ayuda con StringRegExp en un codigo html

Publicado: 24 Jun 2010, 15:30
por arkcrew
Ya consegui solucionarlo, os dejo el code que utlize, al final, encontre otra url que me daba los enlaces directamente, y con la funcion de leer las divs, cambie el innertext por innerhtml para obtener el source y listo, funciona de maravilla...

Código: Seleccionar todo

    #include <INET.au3>
    #include <IE.au3>
    #include <String.au3>
	#include <INET.au3>
#include <Array.au3>
    ;Defino el host:
    Dim $host = "http://taringa.net/rss/ultimos-post" ; Url del canal RSS de taringa que contiene los 21 nuevos post

    ;lanzo la funcion:
    getlinks($host)

    ;Defino las funciones
    Func getlinks($host)
    $var = _INetGetSource($host) ; Obtengo el codigo fuente del canal rss (que viene a ser un archivo XML)
        $array = StringRegExp($var, '<(?i)link>(.*?)</(?i)link>', 3, 3); Leo el contenido dentro de los valores <link></link>
		$TotalLinks=UBound($array) - 1
        for $i = 2 to $TotalLinks ;Empiezo por el dos para comenzar a leer los titulos de los post evitando el titulo de la pagina y cabecera
          TrayTip("Obteniendo datos","Link "& $i-1 &" de " & $TotalLinks-1 ,1,1)
          Sleep(100)
          $oIE = _IECreate($array[$i],0,0); creo la pagina, ya que la url debe redirigirnos a otra distinta, de la cual debemos obtener el codigo html
		  _IELoadWait ($oIE);Esperamos a que cargue la página
          $html = _IEDocReadHTML($oIE);Obtengo el codigo html de la página
          $title = _IEPropertyGet($oIE,"title") ;Obtengo el titulo de la url enviada
           $oDivs = _IETagNameGetCollection ($oIE, "Div")
For $oDiv In $oDivs
   If $oDiv.classname=="post-contenido" Then
      msgbox(0,"",$oDiv.innerhtml)
   EndIf
Next
       Next
    EndFunc
Gracias por todo!!, siempre es un placer contar con vuestra ayuda!!!

Un saludo