2017-01-06 1 views
1

Ich möchte diese Website crawlen und die Tabelle http://www.basketligaen.dk/da/top/turnering/stilling/ bekommen, aber wenn ich versuche, den Inhalt zu erhalten, bekomme ich DOMNodeList Object ([length] => 0). Mein Code sieht wie folgt aus:Verwenden Sie Curl und Xpath, um die Website zu crawlen

$curl = curl_init('http://www.basketligaen.dk/da/top/turnering/stilling/'); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10'); 
    $html = curl_exec($curl); 
    curl_close($curl); 

    $doc = new DOMDocument(); 
    $doc->loadHTML($html); 
    $xpath = new DOMXpath($doc); 
    $elements = $xpath->query("//div[@id='3739']/table"); 
    print_r($elements); 

ich viele Seiten vor gekrochen, aber ich kann das Problem mit diesem finden - gibt es jemanden, der sehen kann, was ich falsch mache?

Antwort

0

Es gibt kein table Element direkt unter dem div Element mit id="3739".

Die Tabelle ist unter dem div Element mit id="3738" und nicht direkt sollte diese Arbeit:

//div[@id='3738']//table 

Notiere die doppelten Schrägstrich, was bedeutet, eine Eltern-Kinder-Beziehung, aber in jeder Tiefe Ebene.


Als Randbemerkung, weiß ich nicht besonders, wie die Lesbarkeit und die Robustheit des aktuellen XPath-Ausdrucks - die 3738 id Art „kryptische“ ist, es bringt keine wertvollen Daten orientierten Informations- und hat eine hohe Chance, geändert zu werden. Wahrscheinlich wäre eine bessere Art und Weise auf dem Tabellenkopf verlassen:

//div[. = 'Grundspil']/following-sibling::table 

Alles, was gesagt, gibt es ein größeres Problem hier - die Tabelle ist ein Teil eines JavaScript „Widget“ und ist so konfiguriert, und dynamisch geladen von Ihrem Browser und seiner JavaScript-Engine. Wenn Sie Ihre Seite mit "curl" herunterladen, erhalten Sie nur die erste HTML-Seite, die nicht die gewünschte Tabelle enthält.

Eine der einfachsten (in Bezug auf die Implementierung) Problemumgehungen wäre die Automatisierung eines echten Browsers beispielsweise über selenium. Die oben genannten Punkte zu den XPath-Ausdrücken wären immer noch anwendbar, da es unter anderem auch den "by xpath" -Lokator gibt.

+0

Beim Ändern in: $ elements = $ xpath-> query ("// div [@ id = '3739'] // Tabelle"); und dann das Element drucken: print_r ($ elements); - Ich bekomme immer noch: DOMNodeList Object ([Länge] => 0). Sollte ich nicht eine Länge größer als 0 bekommen oder fehlt mir etwas? –

+0

@AndreasBaran ah, erhalten Sie das leere Ergebnis, auch wenn Sie den anderen Ausdruck aus der Antwort verwenden? – alecxe

+0

ja - wenn dies ausgeführt wird: $ elements = $ xpath-> query ("// div [. = 'Grundstaub']/following-gleichgeordnete :: tabelle"); print_r ($ elements); Ich bekomme immer noch ein leeres Ergebnis –

Verwandte Themen