2011-08-07 15:22 @682 |
|
|
makhix
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.
|
2011-08-07 18:15 @802 |
|
|
 |
explorer
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
|
2011-08-07 20:30 @896 |
|
|
makhix
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.
|
2011-08-09 09:09 @423 |
|
|
makhix
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.
|
2011-08-09 18:15 @802 |
|
|
makhix
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. Using perl Syntax Highlighting sub talles
{
use WWW::Scripter;
$w = new WWW::Scripter;
$w->use_plugin('JavaScript');
$w->eval('alert("Hola Mono")');
$w->use_plugin(JavaScript =>
engine => 'JE',
init => \&init, # initialisation function
); # for the JS environment
}
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.
|
2011-08-09 19:32 @855 |
|
|
 |
explorer
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
|
2011-08-09 22:10 @965 |
|
|
makhix
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: Using html4strict Syntax Highlighting <div id="pdp_sizes">
<ul>
<li><a class="">06.0</a></li>
<li><a class="">06.5</a></li>
<li><a class="">07.0</a></li>
<li><a class="">07.5</a></li>
<li><a class="">08.0</a></li>
<li><a class="">08.5</a></li>
<li><a class="">09.0</a></li>
<li><a class="">09.5</a></li>
<li><a class="">10.0</a></li>
<li><a class="">10.5</a></li>
<li><a class="">11.0</a></li>
<li><a class="">11.5</a></li>
<li><a class="">12.0</a></li>
<li><a class="">13.0</a></li>
<li><a class="">14.0</a></li>
<li><a class="">15.0</a></li>
</ul>
</div>
Ahora una vez que el js entra en acción, lo sobrescribe de la siguiente manera: Using html4strict Syntax Highlighting <div id="pdp_sizes">
<ul>
<li><a class="">06.0</a></li>
<li><a class="available">06.5</a></li>
<li><a class="available">07.0</a></li>
<li><a class="">07.5</a></li>
<li><a class="available">08.0</a></li>
<li><a class="available">08.5</a></li>
<li><a class="available">09.0</a></li>
<li><a class="available">09.5</a></li>
<li><a class="available">10.0</a></li>
<li><a class="available">10.5</a></li>
<li><a class="available">11.0</a></li>
<li><a class="available">11.5</a></li>
<li><a class="available">12.0</a></li>
<li><a class="available">13.0</a></li>
<li><a class="available">14.0</a></li>
<li><a class="available">15.0</a></li>
</ul>
</div>
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.
|
2011-08-10 12:03 @544 |
|
|
 |
explorer
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
|
|
Página 1 de 1
|
[ 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
|
|
Socializa |
 |
|