2010-02-26 1 views
6

Ich benutze PHP Simple HTML DOM Parser, um einige Daten eines Webshops zu scrappen (läuft auch XAMPP 1.7.2 mit PHP5.3.0), und ich habe Probleme mit <tbody> Tags . Die Struktur der Tabelle ist, essentialy (Details sind nicht wirklich so wichtig):<tbody> Glitch in PHP Einfacher HTML DOM Parser

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

Nun, ich versuche, auf den <tbody> Abschnitt zu erhalten, indem Code verwendet:

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

Es spielt keine Wenn Sie versuchen, ein Echo zu erzeugen, wird nichts ausgegeben. Ich habe den Code auf anderen Elementen, <thead>, <table>, sogar etwas wie <span class="price"> getestet und sie alle funktionieren gut (natürlich, Entfernen ", 0" schlägt den Code fehl). Sie geben alle ihre richtigen Abschnitte. Outertext dito. Aber es schlägt alles auf <tbody>.

Jetzt habe ich den Parser überflogen, aber ich bin mir nicht sicher, ob ich es herausfinden kann. Ich habe bemerkt, dass <thead> nicht einmal erwähnt wird, aber es funktioniert gut. shrug

Ich denke, ich könnte versuchen, Kindernavigation zu tun, aber das scheint auch zu stören. Ich habe gerade versucht zu laufen:

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

und keine Würfel. Versucht, children durch first_child und 2 durch 1 zu ersetzen, und immer noch keine Würfel. Lustig, wenn ich versuche ->find anstelle von children, funktioniert es perfekt.

Ich bin ziemlich zuversichtlich, ich könnte eine Arbeit um die ganze Sache finden, aber dieses Verhalten scheint seltsam genug, hier zu posten. Mein neugieriger Geist freut sich über all die Hilfe, die er bekommen kann.

Antwort

1

Stellen Sie sicher, dass Ihre tbody von einigen Javascript-Ausführung stammt. Ich hatte das gleiche Problem mit einem Span-Tag. Später fand ich, dass, wenn irgendein HTML-Code über jquery/irgendeine andere Javascript-Ausführung in die Seite kommt, dann in diesem Fall simple_html_dom einfach scheitert.

24

in simple_html_dom.php Datei Kommentar entfernen Zeile # 396

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

Hinweis: In der Version '1.11' (Rev. 184) befindet sich dieser Code in der Zeile' 629'. – h2ooooooo

+0

Dies sollte in der Dokumentation '> erwähnt werden: (' –

+2

In Version 1.5 (Revision 196) befindet sich der Code in Zeile 695 –

1

Vergewissern Sie sich, dass tbody wirklich da ist. Viele Browser fügen tbody Tabellen im Inspektionsbereich hinzu, obwohl sie in der Antwort nicht vorhanden sind.

2

Es gibt einen Bug-Report zu diesem Thema hier: http://sourceforge.net/p/simplehtmldom/bugs/79/

Es ist immer noch zum Zeitpunkt des Schreibens dieses Artikels ist offen. Es gibt eine Alternative fix, wenn Sie nicht wünschen, den Quellcode zu ändern, zum Beispiel in einer Schleife <tr> zu finden ‚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 */ 
    } 

Sie können stattdessen selektiv den Namen übergeordneten Tages überprüfen, während all<tr> Iterieren‘ s etwa so:

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

beachten Sie auch, ein wenig in keinem Zusammenhang Problem, das ich in lief, dass Chrome und FF Inspektoren Tag Suppe in Bezug auf <tbody> und <thead> korrigiert.Seien Sie vorsichtig - schauen Sie sich nur die tatsächliche Quelle an - halten Sie sich von den DOM-Inspektoren fern, wenn Sie auf unerklärliche Probleme stoßen.

+0

Sie gespeichert Mein Nachtmensch, ich weiß nicht, warum du keinen Treffer machst, aber ohne Wechselhelferdatei, deine Lösung ist die beste. –