7

XPath を PhantomJS 1.9.2 で動作させようとしています:

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

これはページの読み込み時に実行され、常に null を返しますが、querySelector は正しく動作しているようです:

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

この特定の XPath 評価サンプルで何か見逃していましたか?

4

2 に答える 2

13

次のように、 document.evaluate 呼び出しを page.evaluate 呼び出しに含める必要があることが最終的にわかりました。

page.evaluate(function() {
    document.evaluate(
        '//div',
        document,
        null,
        XPathResult.ORDERED_NODE_ITERATOR_TYPE,
        null);
});
于 2013-10-26T11:14:44.543 に答える
0

phantomjs を使用して特定の xpath の html コンテンツを取得する場合.. :-)

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);
于 2017-04-28T05:45:46.930 に答える