Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Obtener dato web con XPATH

Estas en el tema de Obtener dato web con XPATH en el foro de PHP en Foros del Web. Buenas developers!!! Realizando un código para obtener una serie de datos de una página web. Me doy de canto en los dientes con un paso ...
  #1 (permalink)  
Antiguo 27/02/2015, 20:48
Avatar de javiipg  
Fecha de Ingreso: febrero-2015
Ubicación: Barcelona
Mensajes: 10
Antigüedad: 9 años, 9 meses
Puntos: 1
Obtener dato web con XPATH

Buenas developers!!!

Realizando un código para obtener una serie de datos de una página web. Me doy de canto en los dientes con un paso en el que no logro progresar. Os explico.

Debo de obtener un número que está dentro de una tabla y para ello utilizo el método DOMXpath para recoger este valor. El problema es que no logro obtenerlo... sin embargo utilizando el mismo código para otro valores que no se encuentras dentro de una tabla, no tengo ningún problema.

Código PHP:
function getPrints($url)
    {
        
        
$contentweb getURL($url);
        
libxml_use_internal_errorstrue);
        
$doc = new DOMDocument$doc->loadHTML$contentweb);
        
$xpath = new DOMXpath$doc);
        
$node $xpath->query'//*[@id="tbl-10144"]/tbody/tr[37]/td[5]/div')->item0);

        if (!
is_null($node)) {

            echo 
$node->getElementsByTagName("div")->textContent;
            
//echo "prueba";
            //exit;
        
}else{
            echo 
"No hay datos";
        }
    } 
Sin embargo si pruebo de obtener cualquier otro dato que no se encuentre dentro de una tabla, no tengo ningún problema en obtenerlo. Ej:

Código PHP:
function getCopies($url)
    {
        
        
$contentweb getURL($url);
        
libxml_use_internal_errorstrue);
        
$doc = new DOMDocument$doc->loadHTML$contentweb);
        
$xpath = new DOMXpath$doc);
        
$node $xpath->query'//*[@id="itm-9353"]/div[2]')->item0);
        
$copies $node->textContent;
        
$copies str_replace(',','',$copies);  
        
$copies intval($copies);
        return 
$copies;;
    } 

La ruta del XPATH imagino que está bien. Utilizo el Google Chrome para obtener las rutas de manera rápida y sencilla. (Adjunto imagne)






Os adjunto una pequeña imagen donde sale parte del código HTML de la web y selecciono el dato que quiero obtener.



Alguna idea de como podría obtenerlo? Estoy abordado ya de tanto probar.

Espero vuestra ayuda, y gracias de antemano!!
Un saludo!!
JaviiPG
  #2 (permalink)  
Antiguo 27/02/2015, 21:03
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Obtener dato web con XPATH

A mi me gustaría saber si tu variable $contentweb contiene realmente el HTML que estás tratando de leer.

¿A qué me refiero?

Seguro dirás que sí porque lo ves con Chrome, no lo niego, pero ¿no será que dicho HTML se construye dinámicamente con Javascript?

Vamos, estoy suponiendo nada más, porque tampoco explicas la fuentes de tus datos, y es imposible para nosotros adivinar exactamente esos detalles.

El asunto es simple, tu error no es de código, porque hasta la ruta de XPATH tiene todo el sentido del mundo.

Así que lo único que podría fallar sería la fuente real de dicho documento, el HTML pues.



Edito: otra cosa que se me ocurre es que dentro de la ruta de XPATH que utilizas ya no hay más divs, pero en tu código tratas de leer más divs de dicho nodo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 27/02/2015, 21:14
Avatar de javiipg  
Fecha de Ingreso: febrero-2015
Ubicación: Barcelona
Mensajes: 10
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Obtener dato web con XPATH

Gracias por tu rápida respuesta pateketrueke!

Entiendo lo que me quieres decir y parece interesante lo que me comentas. Ahora que lo insinúas sí que es posible que la página se genere mediante algún Javascript.

Entiendo que si pudiera facilitar el enlace de la web en la que quiero acceder para recoger los datos sería mucho más fácil, el inconveniente es que es una web interna, concretamente es la web de una impresora.

Tal y como me preguntas sobre si realmente $contentweb contiene el enlace correcto de la web, estoy totalmente convencido que sí, ya que en el segundo ejemplo que muestro, utilizando el mismo procedimiento sí que consigo recoger los datos. Si embargo en la primera función que enseño, no lo consigo, lo único que diferente que hay es que el valor al que quiero acceder está dentro de una tabla. Si intento recoger cualquier otro valor que no esté dentro de la tabla, lo puedo recoger sin problemas!

Espero que este fragmento sirva algo de ayuda para aquellos que estén interesados en echarme una mano.

Como dato quiero añadir que en la función siguiente (la del problema), dentro del IF me muestra "No hay datos" por lo tanto no está recogiendo nada y sospecho del XPATH.

Código PHP:
function getPrints($url)
    {
        
        
$contentweb getURL($url);
        
libxml_use_internal_errorstrue);
        
$doc = new DOMDocument$doc->loadHTML$contentweb);
        
$xpath = new DOMXpath$doc);
        
$node $xpath->query'//*[@id="tbl-10144"]/tbody/tr[37]/td[5]/div')->item0);

        if (!
is_null($node)) {

            echo 
$node->getElementsByTagName("div")->textContent;
            
//echo "prueba";
            //exit;
        
}else{
            echo 
"No hay datos";
        }
    } 

De nuevo quería agradecerte tu atención!
  #4 (permalink)  
Antiguo 27/02/2015, 23:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Obtener dato web con XPATH

¿Podrías ejecutar lo siguiente y mostrar lo que resulte?

Código PHP:
Ver original
  1. $node = $xpath->query( '//*[@id="tbl-10144"]/tbody/tr[37]/td[5]/div');
  2.  
  3. var_dump($node);
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 28/02/2015, 11:40
Avatar de javiipg  
Fecha de Ingreso: febrero-2015
Ubicación: Barcelona
Mensajes: 10
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Obtener dato web con XPATH

Ante todo, muchas gracias por tu interés y ayuda pateketrueke!

El resultado que me dio es NULL.

Después de que me mencionaras que quizás el problema es debido a que la página es generada con javascript, he realizado una prueba. He copiado todo el código fuente y lo he pegado en un archivo nuevo llamado impresora.html . Entonces cuando apunto a esta página, con el código mencionado anteriormente puedo obtener el valor sin problemas!! En cambio si accedo a la página web de la impresora (la página real), no puedo obtener lo datos de esa "maldita" tabla.

Entonces está claro, con el código que tengo ahora mismo cuando intenta recoger el valor del XPATH que le indico, no encuentra nada porque seguramente cuando hace la consulta la tabla su dicha no se ha generado todavía. Si no estoy en lo cierto corrijanme porfavor.

¿Alguna idea? Podría realizar como un tipo de espera para dejar que cargue la página al 100% y después recoger el valor?
  #6 (permalink)  
Antiguo 28/02/2015, 13:30
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Obtener dato web con XPATH

Cita:
¿Alguna idea? Podría realizar como un tipo de espera para dejar que cargue la página al 100% y después recoger el valor?
Ese es el problema: no se puede.

Es decir, cuando PHP "lee la página" se supone que ya termino de evaluarse en el servidor.

Sin embargo, y probablemente, al llegar al navegador use Javascript para generar dicha tabla dinamicamente.

Entonces ahí está el verdadero problema: PHP no puede interpretar Javascript, así que no hay forma de que puedas leer con PHP el código generado, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 28/02/2015 a las 15:27
  #7 (permalink)  
Antiguo 28/02/2015, 14:38
Avatar de javiipg  
Fecha de Ingreso: febrero-2015
Ubicación: Barcelona
Mensajes: 10
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Obtener dato web con XPATH

Entiendo....

Buscaré alguna alternativa a PHP entonces.


Muchas gracias pateketrueke, por tu tiempo y por tu gran ayuda.

Nos vamos viendo por el foro. Realmente hay posts bastante interesantes, espero poder ayudar en alguno.
  #8 (permalink)  
Antiguo 28/02/2015, 15:24
 
Fecha de Ingreso: febrero-2015
Mensajes: 61
Antigüedad: 9 años, 9 meses
Puntos: 15
Respuesta: Obtener dato web con XPATH

encontre eso....

http://phantomjs.org/page-automation.html
  #9 (permalink)  
Antiguo 28/02/2015, 15:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 8 meses
Puntos: 2534
Respuesta: Obtener dato web con XPATH

Por supuesto, existen muchas herramientas en Javascript (NodeJS, Rhino, PhantomJS, CasperJS, NW.js, etc.) que te permiten hacerlo, sin embargo no tienen relación alguna con el foro de PHP.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 28/02/2015, 19:22
Avatar de javiipg  
Fecha de Ingreso: febrero-2015
Ubicación: Barcelona
Mensajes: 10
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Obtener dato web con XPATH

MMan PhantomJS suena muy interesante! ¡Muchas gracias por tu aportación!



Después de tanto probar encontré el fallo!! Realmente el fallo estaba en el XPATH!!

Código:
//*[@id="tbl-10144"]/tbody/tr[37]/td[5]/div
Por lo visto ese tbody no se lo tragaba muy bien. Lo he eliminado y ha resultado funcionar.

Código:
//*[@id="tbl-10144"]/tr[37]/td[5]/div


Vuelvo a repetir. Muchas gracias por vuestro tiempo!! Lo dicho, espero poder colaborar/investigar en aquellos problemas que vaya viendo por el foro!!

Etiquetas: dato, html, tabla, xpath
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:06.