如何将HTML字符串加载到nodejs模块phantomjs-node

时间:2015-12-21 14:02:52

标签: node.js phantomjs

我使用this nodejs模块来解析HTML。我试图在我的HTML中找到id的元素。我无法获得文档对象。这是我的代码:

var phantom = require('phantom');
var fs = require('fs');

phantom.create(function (ph) {
    ph.createPage(function (page) {
        page.open('file://' + __dirname + '/content.txt', function (status) {
            page.evaluate(function() {
                // this code will never executed
                document.getElementById('some_id');
            });

            ph.exit();
        });
    });
}, {
    dnodeOpts: {
        weak: false
    }
});

1 个答案:

答案 0 :(得分:2)

您的示例中没有验证代码。让我们看看我们在这里可以做些什么。

PhantomJS有两个上下文。 page.evaluate()是一个沙盒函数,提供对DOM上下文(或页面上下文)的访问。问题是你不能从DOM上下文返回DOM节点,因为只能传递原始值。

如果要检查页面中是否有元素可用,可以执行以下操作:

page.open('file://' + __dirname + '/content.txt', function (status) {
    page.evaluate(function _inDomContext() {
        return !!document.getElementById('some_id');
    }, function _inOuterContext(result){
        console.log("result: " + result); // true or false
        ph.exit();
    });
});

以下是您应该注意的一些事项:

  • !!将以下表达式的值计算为布尔值,该布尔值可以从DOM上下文中传出。
  • phantomjs-node是node.js和PhantomJS之间的桥梁,它将PhantomJS中同步的每个函数调用转换为phantomjs-node中的异步调用(附加回调)。
  • 应该在 end 调用
  • ph.exit()。别忘了考虑异步行为和潜在的回调。

如果你想在phantomjs-node中等待特定条件(例如,某些元素是异步加载的),那么你可以使用this answer中的函数。