2010-02-26 15 views
6

Estoy usando PHP Simple HTML DOM Parser para raspar algunos datos de una tienda en línea (también ejecutando XAMPP 1.7.2 con PHP5.3.0), y estoy teniendo problemas con la etiqueta <tbody> . La estructura de la tabla es, essentialy (detalles no son realmente tan importante):<tbody> error en PHP Analizador DOM HTML simple

<table> 
    <thead> 
    <!--text here--> 
    </thead> 
    <tbody> 
    <!--text here--> 
    </tbody> 
</table> 

Ahora, estoy tratando de llegar a la sección <tbody> mediante el uso de código:

$element = $html->find('tbody',0)->innertext; 

Doesn No arroje ningún error, simplemente no imprime nada cuando intento repetirlo. He probado el código en otros elementos, <thead>, <table>, incluso algo así como <span class="price"> y todos funcionan bien (por supuesto, eliminando ", 0" falla el código). Todos dan sus secciones correctas. Outertext ídem. Pero todo falla en <tbody>.

Ahora, he hojeado el analizador, pero no estoy seguro de poder resolverlo. Me he dado cuenta de que <thead> ni siquiera se menciona, pero funciona bien. encogimiento de hombros

Creo que podría intentar hacer navegación infantil, pero parece que también falla. Acabo de intentar ejecutar:

$el = $html->find('table',0); 
$el2 = $el->children(2); 
echo $el2->outertext; 

y sin dados. Intenté reemplazar children con first_child y 2 con 1, y todavía no hay dados. Es curioso, sin embargo, si intento ->find en lugar de children, funciona perfectamente.

estoy bastante seguro de que podía encontrar un trabajo en torno a todo el asunto, pero este comportamiento parece bastante extraño para publicar aquí. Mi curiosa mente está feliz por toda la ayuda que puede obtener.

Respuesta

1

Asegúrese de que su tbody proviene de alguna ejecución de javascript. Estaba enfrentando el mismo problema con una etiqueta span. Más tarde descubrí que, si algún código html ingresa a la página a través de jquery/cualquier otra ejecución de javascript, en ese caso simple_html_dom simplemente falla.

24

en comentario de archivo simple_html_dom.php o eliminar la línea # 396

// if ($m[1]==='tbody') continue; 
+1

FYI: en la versión '1.11' (Rev. 184) este código está en la línea' 629'. – h2ooooooo

+0

esto debería mencionarse en la documentación '>: (' –

+2

En la versión 1.5 (Revisión 196) el código está ubicado en la línea 695 –

1

Asegúrese de que tbody es realmente está allí. Muchos navegadores agregarán un tbody a las tablas en el panel de inspección a pesar de que no están presentes en la respuesta.

2

Hay un informe de error para este problema aquí: http://sourceforge.net/p/simplehtmldom/bugs/79/

Todavía está abierto en el momento de escribir estas líneas. Hay una solución alternativa si no desea modificar el código fuente, por ejemplo, en un bucle para encontrar <tr> 's

<?php 
    // The *BROKEN* way to find the <tr>'s 
    // below the <tbody> below the <table id="foo"> 
    foreach($dom->find('tbl#foo tbody tr') as $tr) { 
    /* you will get nothing */ 
    } 

en su lugar puede comprobar de forma selectiva el nombre de la etiqueta de los padres, mientras que la iteración todos<tr>' s de este modo:

<?php 
    // A workaround to find the <tr>'s 
    // below the <tbody> below the <table id="foo"> 
    foreach($dom->find('tbl#foo tr') as $tr) { // note the lack of tbody selector 
    /* you will get all trs, but let's only work with ones with the parent 
     of a tbody! */ 
    if($tr->parent->tag == 'tbody') { // our workaround 
     /* this part will work as you would expect the above broken code to work */ 
    } 
    } 

Tenga en cuenta también, un tema no relacionado que poco me encontré con que Chrome y FF inspectores corregirán sopa etiqueta con respecto <tbody> y <thead>.Tenga cuidado, solo mire la fuente real, manténgase alejado de los inspectores DOM si se encuentra con problemas inexplicables.

+0

Guardado mi hombre de la noche. No sé por qué no recibes ningún golpe, pero sin cambiar el archivo de ayuda, tu solución es la mejor. Gracias. –