Foros del Web » Programando para Internet » PHP »

Uso de DomDocument

Estas en el tema de Uso de DomDocument en el foro de PHP en Foros del Web. Os cuento lo que quiero realizar, en funcion de un patron o palabra, que yo se que esta contenida en un enlace, quisiera ejecutar ese ...
  #1 (permalink)  
Antiguo 26/09/2011, 02:20
 
Fecha de Ingreso: mayo-2011
Mensajes: 64
Antigüedad: 13 años, 6 meses
Puntos: 8
Uso de DomDocument

Os cuento lo que quiero realizar, en funcion de un patron o palabra, que yo se que esta contenida en un enlace, quisiera ejecutar ese enlace para acceder a los datos, entonces mi idea es usar cURL para extraer la informacion que me interesa y DomDocument para lograr acceder justo al enlace que necesito, pero nose muy bien como plantearlo.

Código HTML:
<a style="color:#2255dd" href="pelicula.asp?pelicula=8751">//Enlace que quiero ejecutar
<u>
<b>La sal de este mar</b>//patron o palabra a buscar
</u>
</a> 


Saludos!
  #2 (permalink)  
Antiguo 26/09/2011, 03:34
 
Fecha de Ingreso: mayo-2011
Mensajes: 64
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Uso de DomDocument

La verdad que pensandolo, no se si sera posible poder acceder, ya que no hay ningun medio que identifique "a" para poder acceder a los atributos del enlace...

Si alguien sabe algo por favor lo agradeceria...
  #3 (permalink)  
Antiguo 26/09/2011, 05:32
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: Uso de DomDocument

Sí se puede....

Por ejemplo:
Código PHP:
<?php
$doc 
= new DOMDocument();
$html '<a style="color:#2255dd" href="pelicula.asp?pelicula=8751">//Enlace que quiero ejecutar
<u>
<b>La sal de este mar</b>//patron o palabra a buscar
</u>
</a> '
;
$doc->loadHTML($html);


$list $doc->getElementsByTagName('a')->item(0);
foreach (
$list->attributes as $attr) {
    echo 
'Key: '.$attr->name.' && value='.$attr->nodeValue.'<br>';
    
}




?>
Así accederias al primer 'a' del documento (index(0)) y después, te muestra todos sus atributos.

Se podría meter en un bucle, para hacer todos los nodos 'a', y así poder buscar ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #4 (permalink)  
Antiguo 26/09/2011, 05:42
 
Fecha de Ingreso: mayo-2011
Mensajes: 64
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Uso de DomDocument

Cita:
Iniciado por Eleazan Ver Mensaje
Sí se puede....

Por ejemplo:
Código PHP:
<?php
$doc 
= new DOMDocument();
$html '<a style="color:#2255dd" href="pelicula.asp?pelicula=8751">//Enlace que quiero ejecutar
<u>
<b>La sal de este mar</b>//patron o palabra a buscar
</u>
</a> '
;
$doc->loadHTML($html);


$list $doc->getElementsByTagName('a')->item(0);
foreach (
$list->attributes as $attr) {
    echo 
'Key: '.$attr->name.' && value='.$attr->nodeValue.'<br>';
    
}




?>
Así accederias al primer 'a' del documento (index(0)) y después, te muestra todos sus atributos.

Se podría meter en un bucle, para hacer todos los nodos 'a', y así poder buscar ;)

Gracias, aunque creo que el ejemplo que me has puesto solo vale para ese caso en particular, ya que el patron que yo busque puede varias y por lo tanto su url tambien.


Saludos!
  #5 (permalink)  
Antiguo 26/09/2011, 05:50
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: Uso de DomDocument

El ejemplo que yo he puesto, obtiene, de un código html, la primera etiqueta 'a' (enlace, presumiblemente) y te muestra sus atributos.

Efectivamente, sólo te he mostrado cómo se haria eso. Investiga un poco cómo podrías hacer el resto (hacer un bucle que recorra todas las 'a', y que encuentre si el patrón que buscas está, y en caso afirmativo, que te saque el href! :) ). Dale unas cuantas vueltas ^^
__________________
>> Eleazan's Source
>> @Eleazan
  #6 (permalink)  
Antiguo 26/09/2011, 06:25
 
Fecha de Ingreso: mayo-2011
Mensajes: 64
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Uso de DomDocument

No me salen nada mas que warning, como se nota que hoy es lunes...


En esta funcion, mediante curl me paso la pagina.
Código PHP:
function conectToWeb($url)
    {
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$url);
        
//CURLOPT_URL  Dirección URL a capturar. Este valor también puede ser configurado cuando se inicia una sesión con curl_init().
        
curl_setopt($chCURLOPT_HEADERfalse);//CURLOPT_HEADER    TRUE para incluir el header en el output.
        
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
//CURLOPT_RETURNTRANSFER TRUE para devolver el resultado de la transferencia como string del valor de 
        //curl_exec() en lugar de mostrarlo directamente.
        
echo "1) CHCHCHCHCHCHCCH*-------> "."**".$ch."**"."<br>";
        
//curl_close($ch);
        
$pagina=curl_exec($ch);
        
curl_close($ch);
        return 
$pagina;            
    } 

Y en esta llamo a la funcion que me da la pagina, realizo alguna operacion y comienzo con DOMDocument... quizas me este dando fallo al traerme la web mediente curl, aunque creo que no deberia porque se realizo un echo de la variable que me devuelve conectToWeb, el navegador me lo interpreta...
Código PHP:
$Web=conectToWeb($webInfo);//en utiles.php!!
$resultado=substr(stristr($Web$name), 0strlen($name));//Busqueda del patron
echo $mens=comprobar($resultado$name);//comprobacion
echo "<br>resultado:".$resultado;
        
$doc= new DOMDocument();
        
        
echo 
"<br>DoMdocument:-->";
$doc->loadHTML($Web);
        
$list $doc->getElementsByTagName('a');
        
foreach (
$list->attributes as $attr
{
echo 
'**Key: **'.$attr->name.' && value='.$attr->nodeValue.'<br>';
    

  #7 (permalink)  
Antiguo 26/09/2011, 07:21
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: Uso de DomDocument

Pon esto:
Código PHP:
libxml_use_internal_errors(true); 
antes de usar loadHTML. Así no saldrán los warnings ;)

Y si lo q quieres es recorrer todos los enlaces del documento (y ver el contenido de ellos) usa este bucle:
Código PHP:
foreach($doc->getElementsByTagName('a') as $item) {
    echo 
'Enlace #'.$i.': Keys: <br>';
    foreach (
$item->attributes as $attr) {
        echo 
'Key: '.$attr->name.' && value='.$attr->nodeValue.'<br>';
    }
    echo 
'Contenido: '.$item->textContent;
    echo 
'<br><br><br>';
    
$i++;

Un saludo!
__________________
>> Eleazan's Source
>> @Eleazan
  #8 (permalink)  
Antiguo 26/09/2011, 08:36
 
Fecha de Ingreso: mayo-2011
Mensajes: 64
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Uso de DomDocument

Gracias Eleazan, me sirvio de mucha ayuda!! aqui te pongo el codigo con el resultado:

Código PHP:
echo "<br>DoMdocument:--><br>";
        
libxml_use_internal_errors(true);  
        
$doc->loadHTML($Web);
        
        
//$list = $doc->getElementsByTagName('a')->item(0);
        
$peliculas = array();
        foreach(
$doc->getElementsByTagName('a') as $item) {
           
// echo '1)Enlace #'.$i.': Keys: <br>';
           // echo '1)Contenido: '.$item->textContent;
            
foreach ($item->attributes as $attr) {
                
//echo '2)Key: '.$attr->name.' && value='.$attr->nodeValue.'<br>';
                 
                
if ($attr->name=="href") {
                            
$peliculas[$item->textContent]=$attr->nodeValue;
                    
//    echo "HREF";
                 
}
                 else {
                    
//echo "NO HREF";
                 
}
           }
           
// echo '<br><br><br>';
           
$i++;
        }  
        
$webEpg="http://www.teletexto.com/";
        foreach(
$peliculas as $contenido => $url) {
            
//echo "La pelicula '$contenido' es '$url' <br>";
            
if ($contenido==$resultado)
            {
                
$goWeb=$url;
            }
        } 
  #9 (permalink)  
Antiguo 27/09/2011, 09:02
 
Fecha de Ingreso: mayo-2011
Mensajes: 64
Antigüedad: 13 años, 6 meses
Puntos: 8
Respuesta: Uso de DomDocument

Aun sigo con este rollo pero esta vez es para scrapear otro tipo de código donde no se muy bien de que manera sacar la información, tal y como yo lo hago no es eficiente.

Pongo el código del cual quiero sacar información:

Código HTML:
<font>
<font>
<b>Título: </b>
Robocop (Ciencia Ficción)
</font>
<br>
<font>
<b>Director: </b>
Paul Verhoeven
</font>
<br>
<font>
<b>Intérpretes: </b>
Peter Weller, Nancy Allen, Ronny Cox, Daniel Oherlihy, Kurtwood Smith
</font>
<br>
<font>
<b>Datos: </b>
EE.UU. (1987) 97 minutos
</font>
<br>
<font>
<b>Argumento: </b>
Ambientada en un futuro distópico en la ciudad de Detroit, Michigan. El crimen violento esta fuera de control, y la ciudad, que está en ruina financiera, encarga el funcionamiento del Departamento de Policía -que es privatizado- a la mega corporación OCP (Omni Productos de Consumo). OCP está interesada en la reconstrucción del "Viejo Detroit" y pretende reemplazarlo con lo que llama "Ciudad Delta", pero antes de que este gran proyecto de construcción pueda comenzar, OCP desea acabar con el crimen en la ciudad, y con ese fin crea a RoboCop, un policía cyborg. Lo único necesario es un desafortunado voluntario: el policía Alex Murphy, cruelmente torturado y cosido a balazos en una redada contra el crimen.
</font>
<br>
</font> 

Como se puede apreciar es un font que contiene otros font, yo lo que quiero es sacar la información del director, interpretes, datos y argumento, de tal manera que deberia tener como salida:

Paul Verhoeven || Peter Weller, Nancy Allen, Ronny Cox, Daniel Oherlihy, Kurtwood Smith || EE.UU. (1987) 97 minutos || Ambientada en un futuro distópico en la ciudad de Detroit, Michigan. El crimen violento esta fuera de control, y la ciudad...


Este es el código con el que he intentado sacar la información sin éxito:

Código PHP:
$doc2= new DOMDocument();
$doc2->loadHTML($datosPel);
$DatosPeliculas = array();
echo 
"antes del foreach";
$info=array("Director: ""Interpretes: ""Datos: ""Argumento: ");
//Este array lo uso para ayudar a cortar
$datos=array();
//Donde quiero guardar la informacion
    
foreach($doc2->getElementsByTagName('font') as $item2) {                        
              echo 
'1)Enlace #'.$j.': Keys: <br>';
          echo 
'1)Contenido: '.$item2->textContent;
                foreach(
$info as $infors){
                    if (
substr(stristr($item2->textContent$infors), strlen($infors), strlen($item2->textContent))!=""){
                        
$datos[]=substr(stristr($item2->textContent$infors), strlen($infors), strlen($item2->textContent));
                        }
                    }
                    echo 
'<br><br><br>';
              
$j++;
        }  
print_r($datos); 

Espero que se entienda lo que quiero lograr al menos en este script....

Etiquetas: domdocument
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 15:11.