PhantomJS在评估之前更改网页内容

时间:2014-07-18 21:58:32

标签: dom phantomjs

我想删除一个HTML元素,或者只是在评估/渲染之前删除网页的前N个字符。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:11)

这取决于多种情况。我只概述以下问题的答案的每个组合的步骤。

  1. JS是否称为onload( ol )或是否立即评估了脚本块()?
  2. 是内联脚本()还是单独加载脚本(src属性)( ls )?
  3. 脚本块是否还包含一些不应删除的代码( nr ),还是可以完全删除( rc )?
  4. 1。脚本单独加载(ls)&代码可以完全删除(rc)

    根据匹配的网址注册onResourceRequested听众和request.abort()

    2。脚本单独加载(ls)&还包含其他代码(nr)

    只有当以下代码块不依赖于不应删除的代码时(这是不可能的),才能执行此操作。这很可能是在DOM中注册的点击事件所必需的。

    在这种情况下取​​消请求,如 1。,通过XHR下载脚本,删除不需要的代码部分并向DOM添加代码块。为此,您需要禁用Web安全性,否则如果资源不在同一个域中,则无法请求资源:--web-security=false

    3。脚本加载DOM(是)& JS通过onload(ol)&可以完全删除(rc)

    这可能非常容易出错。您将从page.onInitialized回调开始与setInterval(function(){}, 5)进行间隔。在间隔内,您需要检查是否在页面上下文中设置了window.onload(或者您可以接触的其他内容)。如果确实是要删除的功能,请删除它,方法是选中window.onload.toString().match(/something/)

    这可以直接在页面上下文中完成(在page.evaluate内)。

    4。脚本加载DOM(是)& JS通过onload(ol)&还包含其他代码(nr)

    3。开始,但不是删除window.onload,而是

    eval("window.onload = " + window.onload.toString().replace(/something/,''))
    

    5。脚本加载DOM(是)&脚本块立即评估(即)

    您可以将页面加载为XHR,替换文本并将调整后的内容应用于页面。这基本上是一个填充的about:blank页面。为此,您需要禁用Web安全性,否则如果资源不在同一个域中,则无法请求资源:--web-security=false--local-to-remote-url-access=true。这也适用于 3。 4。

    但仍有一个问题。页面大部分时间都不使用完整的网址。因此,当脚本或元素引用stuff.php时,PhantomJS无法请求它。设置page.content后,页面网址基本上为:空白,所有包含不完整网址的请求都指向file:///...。显然没有这样的文件。这些资源必须替换为完整的URL对应物 这种URL有三种类型:

    • //example.com/resource.php变量协议
    • /resource.php变量协议和域
    • resource.php变量协议,域和资源路径

    完整示例:

    var page = require('webpage').create(),
        url = 'http://www.example.com';
    
    page.open(url, function(status) {
        if (status !== 'success') {
            console.log('Unable to access network');
        } else {
            var content = page.evaluate(function(url){
                var xhr = new XMLHttpRequest();
                xhr.open("GET", url, false);
                xhr.send();
                return xhr.responseText;
            }, url);
            page.render("test_example.png");
            page.content = content.replace(/xample/g,"asy");
            page.render("test_easy.png");
            console.log("url "+page.url); // about:blank
            phantom.exit();
        }
    });
    

    除了简单的字符串替换之外,您可能希望研究正确的操作技术。