• Publicidad

Acceder a contenido generado con JS sobre HTML

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Acceder a contenido generado con JS sobre HTML

Notapor makhix » 2011-08-07 15:22 @682

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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Publicidad

Re: Acceder a contenido generado con JS sobre HTML

Notapor explorer » 2011-08-07 18:15 @802

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acceder a contenido generado con JS sobre HTML

Notapor makhix » 2011-08-07 20:30 @896

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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Acceder a contenido generado con JS sobre HTML

Notapor makhix » 2011-08-09 09:09 @423

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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Acceder a contenido generado con JS sobre HTML

Notapor explorer » 2011-08-09 11:38 @526

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acceder a contenido generado con JS sobre HTML

Notapor makhix » 2011-08-09 18:15 @802

Hola, buenas noches, explorer:
Te paso el código.

Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Acceder a contenido generado con JS sobre HTML

Notapor explorer » 2011-08-09 19:32 @855

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Acceder a contenido generado con JS sobre HTML

Notapor makhix » 2011-08-09 22:10 @965

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ahora una vez que el js entra en acción, lo sobrescribe de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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.
makhix
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2009-08-06 15:13 @675

Re: Acceder a contenido generado con JS sobre HTML

Notapor explorer » 2011-08-10 12:03 @544

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados