Foros del Web » Programando para Internet » PHP »

parsear HTML con php

Estas en el tema de parsear HTML con php en el foro de PHP en Foros del Web. Buenas tardes Estoy haciendo un pequeño trabajo para la universidad que no consiguo que funcione como quiero. Al ejecutar el php , me arroja datos ...
  #1 (permalink)  
Antiguo 11/09/2014, 07:14
 
Fecha de Ingreso: febrero-2013
Mensajes: 21
Antigüedad: 11 años, 8 meses
Puntos: 1
parsear HTML con php

Buenas tardes
Estoy haciendo un pequeño trabajo para la universidad que no consiguo que funcione como quiero.

Al ejecutar el php , me arroja datos pero no todos los que necesitos.
estoy usando simple_html_dom.php

Si ejecutais el php vereis que solo me aparece el primer campo de la columna izquierda.

y de la columna derecha en lugar de extraer la imagen quiero extraer el campo 'title' , pero solo me extrae el primer campo.

Gracias a todos por vuestra ayuda.
Un saludo

Código PHP:
define'_JEXEC');
define'DS'DIRECTORY_SEPARATOR );
define('JPATH_BASE'dirname(__FILE__) );

require_once ( 
JPATH_BASE .DS.'simple_html_dom.php' );





    
$html file_get_html('http://www.panelook.com/LMS500HF07_SAMSUNG_5.0_LCM_parameter_23190.html');


    for(
$k=0;$k<9;$k++){
    
$divContenedor $html->find('div.tabwrapB',$k);
    if(
$divContenedor == null){
        
$divContenedor $html->find('div.tabwrapB');
        foreach(
$divContenedor as $div){
            foreach(
$div->find('th') as $campo){
                
$descripcion[] = "<p>".$campo;
            
            
$cont 0;
            foreach(
$campo->find('td') as $campo2){
            if( 
$campo->plaintext == ''){
            
$descripcion[$cont] .= $campo->plaintext."</p>";
            if(
$cont == 0)
                
            +
$cont;}else{
                foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .= $img->title."</p>";
                    if(
$cont == 0)
                
            
$cont++;}}}}
        }
    }
    else{
        foreach(
$divContenedor->find('th') as $campo){
            
$descripcion[] = "<p>".$campo;
        }
        
$cont 0;
        foreach(
$divContenedor->find('td') as $campo){
            if( 
$campo->plaintext != ''){
            
$descripcion[$cont] .= $campo->plaintext."</p>";
            if(
$cont == 0)
                
            +
$cont;}else{
                foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .= $img->title."</p>";
                    if(
$cont == 0)
                
            +
$cont;}}
        }
    } }
    echo 
$descripcion[$cont]; 
  #2 (permalink)  
Antiguo 11/09/2014, 07:32
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: parsear HTML con php

¿Viste el código html resultante? O sea, el html se parsea mal (y el navegador por lo tanto lo muestra mal) o el código php genera un código html incompleto?
  #3 (permalink)  
Antiguo 11/09/2014, 15:21
 
Fecha de Ingreso: febrero-2013
Mensajes: 21
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: parsear HTML con php

Muchas gracias por su respuesta.
No me fije en eso la verdad , ya he solucionado el tema de que se genere bien el html no de la forma mas correcta pero bueno me basta.

Aun habiendo solucionado eso siguen produciendose los mismos errores.
No se muestra la primera columna de los datos que se estan parseando y de las imagenes de la segunda columna solo se muestra la etiqueta "title" de la primera imagen.

Alguna idea de que puedo estar haciendo mal

asi esta el codigo ahora
Código PHP:
define'_JEXEC');
define'DS'DIRECTORY_SEPARATOR );
define('JPATH_BASE'dirname(__FILE__) );

require_once ( 
JPATH_BASE .DS.'simple_html_dom.php' );





    
$html file_get_html('http://www.panelook.com/LMS500HF07_SAMSUNG_5.0_LCM_parameter_23190.html');
    

    for(
$k=0;$k<9;$k++){
    
$divContenedor $html->find('div.tabwrapB',$k);
    if(
$divContenedor == null){
        
$divContenedor $html->find('div.tabwrapB');
        foreach(
$divContenedor as $div){
            foreach(
$div->find('th') as $campo){
                
$descripcion[] = "<p>".$campo."</p>";
            
            
$cont 0;
            foreach(
$campo->find('td') as $campo2){
            if( 
$campo->plaintext != ''){
            
$descripcion[$cont] .=  "<p>".$campo->plaintext."</p>";
            if(
$cont == 0)
                
            +
$cont;}else{
                foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .=  "<p>".$img->title."</p>";
                    if(
$cont == 0)
                
            +
$cont;}}}}
        }
    }
    else{
        foreach(
$divContenedor->find('th') as $campo){
            
$descripcion[] = "<p>".$campo."</p>";
        }
        
$cont 0;
        foreach(
$divContenedor->find('td') as $campo){
            if( 
$campo->plaintext != ''){
            
$descripcion[$cont] .=  "<p>".$campo->plaintext."</p>";
            if(
$cont == 0)
                
            +
$cont;}else{$cont 0;
                foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .=  "<p>".$img->title."</p>";
                    if(
$cont == 0)
                
            +
$cont;}}
        }
    } }
    echo 
$descripcion[$cont]; 
tambien me he dado cuenta que

si sutituyo en la linea 46 esto
Código PHP:
if( $campo->plaintext != ''
por esto
Código PHP:
if( $campo->plaintext == ''
me muestra todas las etiquetas "title" de las imagenes menos la primera.

Para mi esto no tiene sentido.

Podrias orientarme por favor.
Un saludo
GRacias
  #4 (permalink)  
Antiguo 11/09/2014, 16:17
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: parsear HTML con php

Sólo como posibilidad (no logro meterme bien en tu código), mira el segundo foreach, dice

Código PHP:
Ver original
  1. foreach($campo->find('td') as $campo2){

De ahí adelante, en ese bloque, ¿no estarás confundiendo las variables $campo y $campo2:

Código PHP:
Ver original
  1. foreach($campo->find('td') as $campo2){
  2.             if( $campo2->plaintext != ''){
  3.             $descripcion[$cont] .=  "<p>".$campo2->plaintext."</p>";
  4.             if($cont == 0)
  5.                
  6.             +$cont;}else{
  7.                 foreach($campo2->find('img') as $img){
  8.                     $descripcion[$cont] .=  "<p>".$img->title."</p>";
  9.                     if($cont == 0)
  10.                
  11.             +$cont;}
  #5 (permalink)  
Antiguo 11/09/2014, 16:36
 
Fecha de Ingreso: febrero-2013
Mensajes: 21
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: parsear HTML con php

Muchas gracias de nuevo

Tienes razon gracias por avisar, pero hace exactamente lo mismo ya que el codigo que carga es el que esta despues del "else"

Alguna idea?
  #6 (permalink)  
Antiguo 11/09/2014, 16:50
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: parsear HTML con php

El contador está raro.
Si usas siempre esto:
Código PHP:
Ver original
  1. $cont=0;
  2. if($cont==0)
  3. +$cont;
entonces siempre el contador va a valer 0 ó 1, ¿es correcto?
  #7 (permalink)  
Antiguo 11/09/2014, 17:04
 
Fecha de Ingreso: febrero-2013
Mensajes: 21
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: parsear HTML con php

Ya he realizado pruebas y le he cambiado el nombre a las variable dejando todas diferencias pero nada
  #8 (permalink)  
Antiguo 12/09/2014, 06:16
 
Fecha de Ingreso: febrero-2013
Mensajes: 21
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: parsear HTML con php

bueno señores

he avanzado algo ahora muestra todas las etiquetas que quiero pero no respeta que el valor de la columna izquierda se corresponda con el de la derecha si no que muesta lo siguiente.

Panel Brand :Panel Brand :Panel Model :Panel Type :Application :Operating Temperature :Storage Temperature :RoHS :Specific Feature :,SAMSUNG SMD|LMS500HF07| a-Si TFT-LCD , Panel | ,Portable Navigation Device,Pocket TV,MP4 PMP|-20 ~ 70 °C |-40 ~ 85 °C | ,RoHS Compliance| ,Wide Viewing Angle,White LED Backlight,With Touchscreen,Sunlight Readable,Wide Aspect RatioPanel Size :Dot Resolution :Pixel Configuration :Aspect Ratio :Form Factor :Pixel Pitch :Active Area :Touch Panel :|5.0 inch |480*272(RGB) (WQVGA)| RGB Horizontal Stripe |16:9 (W:H)|Flat Display|0.231*0.231 mm (W*H)|110.88*62.832 mm (W*H)|Embeded (4-wire Resistive, Film / Glass)Display Mode :Contrast Ratio :Display Color :Response Time :Viewing Angle :Viewing Direction :White color Chromaticity :Sunlight Readable :|VA, Normally Black, TMR ,[Panelook copyright, copy is strictly prohibited] IPS Family: AAS, ADS, AHVA, FFS, IPS, PLS, SFT VA Family: ASV, HVA, MVA, PVA, SVA, VA|800 : 1 (Typ.) (Transmissive)|16.7M (8-bit) |17/15 (Typ.)(Tr/Td)|80/80/80/80 (Typ.)(CR≥10) (L/R/U/D)|Symmetry|X:0.320; Y:0.340|Sunlight ReadableVertical Frequency :Reverse Scan :|60Hz ,[Panelook copyright, copy is strictly prohibited] 120Hz (60HZ Input) : Embedded MEMC Circuit 120Hz+120Hz : 120Hz Panel+120Hz Backlight 240Hz (60HZ Input) : Embedded MEMC Circuit|NoLamp Position :Lamp Type :Lamp Shape :Interface Type :|Edge light type|WLED|Array|Included in panel signal interfaceSignal Category :Signal Class :Input Voltage for Panel :Interface Type :|Parallel RGB|Parallel RGB (1 ch, 8-bit)|3.3V (Typ.)|FPCPanelook Updated :Disclaimer :|2014-09-02 11:29|The above parameters are inputted by electronic engineers according to the datasheet, every effort has been made to reduce errors, but we can not guarantee the parameter is entirely correct.Customer Sample (CS) :Mass Production (MP) :Late Time Order (LTB) :Last Time Shipment (LTS) :Production State Now :|--|--|--|--| Discontinued ,

ahora el codigo esta asi por si a alguien le interesa:

Código PHP:
define'_JEXEC');
define'DS'DIRECTORY_SEPARATOR );
define('JPATH_BASE'dirname(__FILE__) );

require_once ( 
JPATH_BASE .DS.'simple_html_dom.php' );





    
$html file_get_html('http://localhost/panelook/mia_parser/panel.html');



    for(
$k=0;$k<9;$k++){
    
$divContenedor $html->find('div.tabwrapB',$k);
    if(
$divContenedor == null){
        
$divContenedor $html->find('div.tabwrapB');
        foreach(
$divContenedor as $div){
        foreach(
$div->find('th') as $campo){
            
$descripcion[] = "<p>".$campo->plaintext;
        }
        
$cont 0;
        foreach(
$div->find('td') as $campo){
            if( 
$campo->plaintext != ''){
            
$descripcion[$cont] .=  "|".$campo->plaintext."</p>";
            if(
$cont == 0)
                
            +
$cont;}if( $campo->plaintext == ''){
            foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .=  "|".$img->title."</p>";
            if(
$cont == 0)
                
            +
$cont;}}if( $campo->plaintext != ''){
            foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .=  "|".$img->title."</p>";
            if(
$cont == 0)
                
            +
$cont;}}
        }
    } }
    else{
        
        foreach(
$divContenedor->find('th') as $campo){
            
$descripcion[] = $campo->plaintext;
        }
        
$cont 0;
        foreach(
$divContenedor->find('th') as $campo){
            
            
$descripcion[$cont] .= $campo->plaintext;
            if(
$cont == 0)
                
            +
$cont;}
        foreach(
$divContenedor->find('td') as $campo){
            if( 
$campo->plaintext != ''){
            
$descripcion[$cont] .=  "|".$campo->plaintext;
            if(
$cont == 0)
                
            +
$cont;}if( $campo->plaintext == ''){
            foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .=  ",".$img->title;
            if(
$cont == 0)
                
            +
$cont;}}if( $campo->plaintext != ''){
            foreach(
$campo->find('img') as $img){
                    
$descripcion[$cont] .=  ",".$img->title;
            if(
$cont == 0)
                
            +
$cont;}}
        }
    } }
$valor str_replace ('×','*',$descripcion[$cont]);
    echo 
$valor
alguna idea
  #9 (permalink)  
Antiguo 12/09/2014, 19:52
 
Fecha de Ingreso: febrero-2013
Mensajes: 21
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: parsear HTML con php

Bueno señores

Ya tengo la solucion a mi pregunta, el tema estaba en el foreach, ya que el primer foreach lo hacia sobre un div muy superior y no sobre el inmediatemente anterior.

y ademas no añadia el contador correctamente sobre cada uno de los divs que estaba parseando por eso solo me parecia el primer valor de todos los que necesitaba de ese campo.

Que estúpido te sientes cuando tienes la solución delante y no la ves, aunque tambien sienta bien verla por ti mismo.

bueno dejo la solucion , espero que sirva de ayuda a alguien

Código PHP:
    foreach($divContenedor->find('tr') as $campo){
            
$descripcion[] = '';
            
$cont 0;
        foreach(
$campo->find('th') as $th){
            
            
$descripcion[$cont] .= '<p>'.$th->plaintext;
            if(
$cont == 0)
                
            +
$cont;}
            foreach(
$campo->find('td') as $td){
            if( 
$td->plaintext != ''){
            
$descripcion[$cont] .=  $td->plaintext.'</p>';
            if(
$cont == 0)
                
            +
$cont;}if( $td->plaintext == ''){
            foreach(
$td->find('img') as $img){
                    
$descripcion[$cont] .=  $img->title.'</p>';
            if(
$cont == 0)
                
            +
$cont;}}if( $td->plaintext != ''){
            foreach(
$td->find('img') as $img){
                    
$descripcion[$cont] .= $img->title.',';
            if(
$cont == 0)
                
            +
$cont;}}
        }
        } 
Un saludo a esta gran comunidad .

Etiquetas: html, parsear
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 22:33.