2010-02-26 15 views
6

Sto usando PHP Simple HTML DOM Parser per analizzare alcuni dati di un negozio online (anche eseguendo XAMPP 1.7.2 con PHP5.3.0), e sto riscontrando problemi con il tag <tbody> . La struttura della tabella è, essentialy (dettagli non sono poi tanto importante):<tbody> glitch in PHP parser DOM HTML semplice

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

Ora, io sto cercando di ottenere la sezione <tbody> utilizzando il codice:

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

doesn Non commetto errori, non stampa nulla quando tento di farlo eco. Ho testato il codice su altri elementi, <thead>, <table>, anche qualcosa come <span class="price"> e funzionano tutti bene (naturalmente, rimuovendo ", 0" non riesce il codice). Tutti danno le loro sezioni corrette. Testo esterno idem. Ma fallisce tutto su <tbody>.

Ora, ho sfogliato il parser, ma non sono sicuro di riuscire a capirlo. Ho notato che <thead> non è nemmeno menzionato, ma funziona bene. shrug

Immagino che potrei provare a fare la navigazione dei bambini, ma sembra che glitch pure. Ho appena provato a correre:

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

e nessun dado. Ho provato a sostituire children con first_child e 2 con 1, e ancora nessun dado. Divertente, però, se provo ->find anziché children, funziona perfettamente.

Sono abbastanza sicuro di riuscire a trovare un modo per aggirare il tutto, ma questo comportamento sembra abbastanza strano da postare qui. La mia mente curiosa è felice per tutto l'aiuto che può ottenere.

risposta

1

Assicurati che il tuo tbody provenga da un'esecuzione di javascript. Stavo affrontando lo stesso problema con un tag span. Più tardi ho scoperto che, se qualche codice html entra nella pagina tramite jquery/qualsiasi altra esecuzione di javascript, allora in quel caso simple_html_dom fallisce semplicemente.

24

nel commento del file simple_html_dom.php o rimuovere la linea # 396

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

FYI: Nella versione '1.11' (Rev. 184) questo codice è alla riga' 629'. – h2ooooooo

+0

dovrebbe essere menzionato nella documentazione '>: (' –

+2

Nella versione 1.5 (Revisione 196) il codice si trova alla riga 695 –

1

Assicurarsi che tbody è davvero c'è. Molti browser aggiungeranno un tocco alle tabelle nel pannello di controllo anche se non sono presenti nella risposta.

2

C'è un bug report per questo problema qui: http://sourceforge.net/p/simplehtmldom/bugs/79/

E 'ancora aperto al momento in cui scriviamo. C'è una correzione alternativa se non si desidera modificare il codice sorgente, per esempio in un ciclo per trovare <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 */ 
    } 

si può invece controllare selettivamente il nome del tag genitore mentre l'iterazione tutti<tr>' s in questo 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 */ 
    } 
    } 

si noti inoltre, una questione un po 'estraneo che mi sono imbattuto in, che Chrome e FF ispettori correggere zuppa di tag per quanto riguarda <tbody> e <thead>.Fai attenzione - guarda solo la fonte reale - stai lontano dagli ispettori DOM se ti imbattono in problemi inspiegabili.

+0

Hai salvato il mio uomo della notte, non so perché non prenda alcun colpo ma senza cambiare file di supporto, la tua soluzione è la migliore. –