2013-10-25 11 views
7

Ich versuche, XPath zu bekommen mit PhantomJS arbeiten 1.9.2:XPath-Suche funktioniert nicht in PhantomJS

var getElementsByXPath = function(xPath) { 
    return document.evaluate(
    xPath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 
}; 
var root = getElementsByXPath("//div").iterateNext(); 

Diese auf Seite Last ausgeführt wird und immer null zurück, während querySelector richtig zu funktionieren scheint:

var divs = page.evaluate(function(s) { 
    return document.querySelector(s); 
}, 'div'); 

Habe ich etwas in diesem bestimmten XPath bewerten Probe zu verurteilen?

+0

Welcher MIME-Typ hat das Dokument? Verwendet es Namespaces, z.B. ' ...'? –

+0

Ich versuchte es zum Beispiel mit google.com und mit vielen anderen Seiten. Gleiche Ergebnisse. –

+0

Beeinflusst der MIME-Typ überhaupt die XPath-Implementierung in WebKit? PhantomJS-Site sagt, dass es native Unterstützung für DOM-Handhabung, CSS-Selektor, JSON, Canvas und SVG hat. Bedeutet es, dass es keine eingebaute Fähigkeit für XPath hat? –

Antwort

13

ich habe endlich herausgefunden, dass der Anruf document.evaluate mit einem page.evaluate Anruf wie folgt angenommen werden:

page.evaluate(function() { 
    document.evaluate(
     '//div', 
     document, 
     null, 
     XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
     null); 
}); 
+0

Sie sollten Ihre eigene Antwort akzeptiert haben. –

0

Wenn Sie mit PhantomJS html Inhalt eines bestimmten XPath erhalten möchten .. :-)

var xpath= '//*[@id="2b"]'; 
var address= 'www.mywebadress.com'; 
page.open(address, function(status) { 
     setTimeout(grabHtml, 2500); 
    }); 

function grabHtml() { 

var html = page.evaluate(function(xpath) { 

    if (document.evaluate) { 
     var xPathRes = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null) 
     if (xPathRes.singleNodeValue) { 
      var c = html.singleNodeValue.innerHTML; 
     } else if (xPathRes) { 
      var c = "No content found!"; 
     } 
    } else { 
     var c = "does not support the evaluate method!"; 
    } 
    return c; 
}, xpath); 

console.log(html);