2013-10-25 5 views
7

Я пытаюсь получить XPath работать с PhantomJS 1.9.2:XPath поиск не работает в PhantomJS

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

Это выполняется при загрузке страницы и всегда возвращает нуль, тогда как querySelector кажется правильно работать:

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

Я пропустил что-то в этом конкретном примере оценки XPath?

+0

Какой тип MIME имеет документ? Использует ли он пространства имен, например. ' ...'? –

+0

Я попробовал это с помощью google.com, например, и со многими другими сайтами. Те же результаты. –

+0

Влияет ли тип MIME на реализацию XPath в WebKit? Сайт PhantomJS говорит, что у него есть встроенная поддержка обработки DOM, селектора CSS, JSON, Canvas и SVG. Означает ли это, что у него нет встроенных возможностей для XPath? –

ответ

13

я, наконец, узнал, что document.evaluate вызов должен быть обнялись с page.evaluate вызова, как следующее:

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

Вы должны были принять свой собственный ответ. –

0

Если вы хотите получить HTML содержимое определенного XPath с phantomjs .. :-)

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); 
Смежные вопросы