Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Acceder a contenido generado con JS sobre HTML Responder al tema
Nuevo tema


Página 1 de 1  [ 9 mensajes ] 
 
Nota 2011-08-07 15:22 @682

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Acceder a contenido generado con JS sobre HTML
Hola, buenas tardes.

Me pregunto si alguno tuvo esta dificultad. Estoy tratando de capturar un listado generado con JavaScript en una página web, pero HTML::PaserTag solamente procesa la página antes de que cargue el JavaScript.

¿Alguien sabe de un módulo que se pueda usar para salvar esta dificultad?

Estuve fijándome en los módulos:

-WWW::Mechanize
-WWW::Mechanize::Plugin::JavaScript

Pero aun no me doy una idea.

También estuve viendo documentación sobre HTML::DOM a ver si podía acceder a través de la implementación del DOM desde Perl, pero no me funcionó.

Desde ya, gracias a todos.


Nota 2011-08-07 18:15 @802
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a contenido generado con JS sobre HTML
En un par de ocasiones me pasó a mi. Lo solucioné al analizar el código JavaScript y ver cómo era el URL que construía, con lo que solución fue muy sencilla.

Bueno, no tanto... una de las operaciones consistía en realizar una operación matemática (una suma) entre distintos números, y concatenar un par de cadenas de caracteres. Y no siempre se resolvía de la misma manera.

Se resolvió, manipulando la expresión en JavaScript, para que los operadores fueran los de Perl, y pasar la expresión resultante por un eval(), con lo que daba la solución correcta.

Bueno, fue fácil. Pero en otros códigos JavaScript, no es tan obvio, sino que incluso, es diabólico.

En Perl encontrarás algunos módulos para interpretar JavaScript, pero no sé cómo de potentes son.

El segundo módulo que indicas dice que está obsoleto, y que en su lugar debe usarse WWW::Scripter::Plugin::JavaScript, que a su vez puede usar los motores JE (por defecto) o WWW::Scripter::Plugin::SpiderMonkey.

_________________
JF^D Perl programming


Nota 2011-08-07 20:30 @896

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Acceder a contenido generado con JS sobre HTML
Gracias por tu respuesta, explorer.

Y coincido con vos, en algunas ocasiones puede ser diabólico el JavaScript, ¡je,je! Me hiciste reír.
Bueno voy a ir probando con estos módulos y os iré comentando qué tal me va.
Saludos.


Nota 2011-08-09 09:09 @423

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Acceder a contenido generado con JS sobre HTML
Buenos días.

La verdad que no doy pié con bola con esto de los plugins del JavaScript.

Necesitaría si alguien me tira una soga. Necesito identificar un nodo que se crea con JavaScript al cargar la página, y sería conveniente si se pudiera enganchar con la sintaxis del js-dom tipo: getElementBy.FirstChild o algo así.

Si alguien tiene una idea de cómo levantar el texto de este nodo, y me pone un pequeño ejemplo se lo voy a agradecer bastante. He leído la documentación de algunos módulos y probado otros experimentales, pero nada. Creo que debo ser yo que el no lo entiende bien.

Gracias.


Nota 2011-08-09 11:38 @526
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a contenido generado con JS sobre HTML
Podrías publicar algo del código que tienes hecho, y de los errores que salen, para ver qué puede estar pasando.

_________________
JF^D Perl programming


Nota 2011-08-09 18:15 @802

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Acceder a contenido generado con JS sobre HTML
Hola, buenas noches, explorer:
Te paso el código.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. sub talles
  2. {
  3.   use WWW::Scripter;
  4.   $w = new WWW::Scripter;
  5.  
  6.   $w->use_plugin('JavaScript');
  7.   $w->eval('alert("Hola Mono")');
  8.  
  9.   $w->use_plugin(JavaScript =>
  10.           engine  => 'JE',
  11.           init    => \&init, # initialisation function
  12.   );                         # for the JS environment
  13.  
  14. }
  15.  


Lo único que consigo con esto es hacer que me escriba en el <Body> "Hola Mono".
No me tira el cuadro de alerta que debería.
Si consigo que me lo haga, directamente ya sé cómo seguir.
Gracias.


Nota 2011-08-09 19:32 @855
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a contenido generado con JS sobre HTML
Perl no puede sacar una caja de alerta desde el JavaScript, pues no posee ninguna biblioteca gráfica implícita para poder llamar al sistema operativo y que la saque en pantalla. Eso es trabajo del cliente web, del navegador web.

Tienes dos opciones: una es usar un complemento como WWW-Mechanize-Firefox, que permite controlar el navegador Firefox desde Perl, y de esa manera, es el propio navegador el que se encarga de interpretar y ejecutar el código JavaScript.

La otra opción es seguir usando el módulo WWW::Scripter. En la documentación, en la sección Window-Related Methods se comentan las funciones set_alert_function(), set_confirm_function() y set_prompt_function(), con las que puedes definir las funciones Perl que deberán ser utilizadas cuando en el código JavaScript se encuentre con alert(), confirm() y prompt(). Ahí también pone que, por defecto, solo está definida la alert(), en la que solo saca a la salida estándar la cadena de texto indicada, que es lo que te está pasando. Lo que tienes que hacer, entonces, es definir una función para alert() en la que, por ejemplo, le puedas sacar, al usuario, la cadena de texto en pantalla, o grabarlo a disco.

_________________
JF^D Perl programming


Nota 2011-08-09 22:10 @965

Perlero Nuevo
Registrado: 2009-08-06 15:13 @675
Mensajes: 26
Re: Acceder a contenido generado con JS sobre HTML
Hola, explorer.

Creo que tengo una confusión aquí. Luego de meditarlo por una largo rato, entendí que lo que trataba de hacer es conseguir que Perl me interpretara JavaScript, para luego poder acceder por el js-dom a los nodos que necesito que son escritos por el js.

Pero el hecho es que no necesito que Perl me ejecute js, solo que espere hasta que js termine de escribir en la página.

Te pongo un ejemplo.

El código HTML es el siguiente, antes de que lo sobrescriba el js:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
  1. <div id="pdp_sizes">
  2.         <ul>
  3.                 <li><a class="">06.0</a></li>
  4.                 <li><a class="">06.5</a></li>
  5.                 <li><a class="">07.0</a></li>
  6.                 <li><a class="">07.5</a></li>
  7.                 <li><a class="">08.0</a></li>
  8.                 <li><a class="">08.5</a></li>
  9.                 <li><a class="">09.0</a></li>
  10.                 <li><a class="">09.5</a></li>
  11.                 <li><a class="">10.0</a></li>
  12.                 <li><a class="">10.5</a></li>
  13.                 <li><a class="">11.0</a></li>
  14.                 <li><a class="">11.5</a></li>
  15.                 <li><a class="">12.0</a></li>
  16.                 <li><a class="">13.0</a></li>
  17.                 <li><a class="">14.0</a></li>
  18.                 <li><a class="">15.0</a></li>
  19.         </ul>
  20. </div>
  21.  


Ahora una vez que el js entra en acción, lo sobrescribe de la siguiente manera:
Syntax: [ Download ] [ Hide ]
Using html4strict Syntax Highlighting
  1. <div id="pdp_sizes">
  2.         <ul>
  3.                 <li><a class="">06.0</a></li>
  4.                 <li><a class="available">06.5</a></li>
  5.                 <li><a class="available">07.0</a></li>
  6.                 <li><a class="">07.5</a></li>
  7.                 <li><a class="available">08.0</a></li>
  8.                 <li><a class="available">08.5</a></li>
  9.                 <li><a class="available">09.0</a></li>
  10.                 <li><a class="available">09.5</a></li>
  11.                 <li><a class="available">10.0</a></li>
  12.                 <li><a class="available">10.5</a></li>
  13.                 <li><a class="available">11.0</a></li>
  14.                 <li><a class="available">11.5</a></li>
  15.                 <li><a class="available">12.0</a></li>
  16.                 <li><a class="available">13.0</a></li>
  17.                 <li><a class="available">14.0</a></li>
  18.                 <li><a class="available">15.0</a></li>
  19.         </ul>
  20. </div>
  21.  


Ahora, lo que no puedo lograr es llegar a estos nodos con la clase "available" y obtener el texto.

No sé, creo que estoy mal encaminado, a esta hora ya no sé bien qué hago.

Bueno, saludos y gracias.


Nota 2011-08-10 12:03 @544
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Acceder a contenido generado con JS sobre HTML
Por lo que veo, solo quieres acceder a los elementos que tienen puesta la clase available. Pero eso solo podemos saberlo si antes se ha ejecutado un JavaScript.

Se me ocurren varias posibilidades:

  • El código JavaScript, para marcar esas entradas, debe obtener la información de otro sitio, bien a través de peticiones HTTP a otro servicio web, o bien esa información está almacenada en alguna estructura de datos en la propia página HTML o en alguna otra enlazada por marcas <link> o accesible a través del código JavaScript. En este caso, te vale con saber acceder a esa información de forma directa.
  • Ejecutar el código JavaScript dentro de Perl no te sirve, porque, hasta donde yo conozco, no existe ningún módulo que interprete JavaScript y permita modificar el DOM de la página HTML que lo contenga. Solo se puede ejecutar código JavaScript, y nada más.
  • La solución última es la usar el complemento que maneja a Firefox (indicado antes). De esa manera, le pedirás a Firefox que vaya a una determinada página, esperas a que cargue, y luego le pides que te mande el código HTML final. Si estás en Windows, también puedes probar con el IExplorer, con el módulo Win32::IE::Mechanize. En la página de recetas de WWW::Mechanize::Firefox::Cookbook tienes ejemplos de cómo manejar Firefox desde Perl.

_________________
JF^D Perl programming


Responder al tema  [ 9 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO