2010-02-26 17 views
6

Używam PHP Simple Parser DOM DOM do skrobania niektórych danych z sklepu internetowego (również z XAMPP 1.7.2 z PHP5.3.0), i mam problemy z tagiem <tbody> . Struktura tabeli jest essentialy (szczegóły nie są aż tak istotne):<tbody> glitch w PHP Prosty parser DOM HTML

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

Teraz próbuję dostać się do sekcji <tbody> za pomocą kodu:

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

nie robi nie wyrzuca żadnych błędów, po prostu nic nie wypisuje, gdy próbuję to powtórzyć. Przetestowałem kod na innych elementach, <thead>, <table>, nawet coś takiego jak <span class="price"> i wszystkie działają poprawnie (oczywiście, usunięcie ", 0" nie powiedzie się kodu). Wszystkie podają poprawne sekcje. Outertext ditto. Ale wszystko zawiedzie <tbody>.

Teraz przejrzałem parser, ale nie jestem pewien, czy mogę to zrozumieć. Zauważyłem, że <thead> nie jest nawet wspomniane, ale działa dobrze. wzruszając ramionami

Zgaduję, że mógłbym spróbować zrobić nawigację dla dzieci, ale wydaje się, że również usterka. Właśnie próbowałem uciekać:

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

i bez kości. Próbowałem zastąpić children z first_child i 2 1, a nadal nie kości. Zabawne, ale jeśli spróbuję ->find zamiast children, to działa idealnie.

Jestem przekonany, że mogę znaleźć całą pracę, ale to zachowanie wydaje się dość dziwne, aby opublikować tutaj. Mój ciekawy umysł jest szczęśliwy z powodu wszelkiej pomocy, jaką może uzyskać.

Odpowiedz

1

Upewnij się, że twoja wersja tbody pochodzi z jakiegoś wykonania javascript. Miałem ten sam problem z tagiem span. Później okazało się, że jeśli dowolny kod HTML dostaje się do strony poprzez jquery/dowolne inne wykonywanie javascript, wówczas w takim przypadku po prostu nie powiedzie się simple_html_dom.

24

w simple_html_dom.php komentarzu pliku lub usunąć wiersz # 396

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

FYI: W wersji '1.11' (Rev. 184) kod ten znajduje się w linii' 629'. – h2ooooooo

+0

powinno to być wspomniane w dokumentacji '>: (' –

+2

W wersji 1.5 (wersja 196) kod znajduje się w linii 695 –

1

Upewnij się, że tbody jest naprawdę tam jest. Wiele przeglądarek doda tbody do tabel w panelu inspekcji, nawet jeśli nie są one obecne w odpowiedzi.

2

Jest raport o błędzie do tej kwestii tutaj: http://sourceforge.net/p/simplehtmldom/bugs/79/

To jest nadal otwarta w momencie pisania tego tekstu. Istnieje alternatywa fix jeśli nie chcesz zmodyfikować kod źródłowy, na przykład w pętli znaleźć <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 */ 
    } 

Można zamiast selektywnie sprawdzić nazwę znacznika nadrzędnego podczas iteracji wszystkie<tr>” s tak:

<?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 */ 
    } 
    } 

Należy również pamiętać, lekko niezwiązane problem, że wpadłem, że Chrome i FF inspektorzy poprawi tag zupę dotyczące <tbody> i <thead>.Bądź ostrożny - patrz tylko na rzeczywiste źródło - trzymaj się z dala od inspektorów DOM, jeśli napotkasz na niewytłumaczalne problemy.

+0

Zapisałeś mój nocny człowieku Nie wiem, dlaczego nie bierzesz żadnego trafienia, ale bez pliku pomocnika zmian, twoje rozwiązanie jest najlepsze. –