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

use*_*748 6 dom phantomjs

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

有没有办法做到这一点?

Art*_* B. 11

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

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

1.脚本单独加载(ls)和代码可以完全删除(rc)

注册到onResourceRequested监听器并request.abort()根据匹配的URL.

2.脚本单独加载(ls)并包含其他代码(nr)

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

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

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

这可能非常容易出错.你会开始的时间间隔与setInterval(function(){}, 5)page.onInitialized回调.在区间内,您需要检查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/,''))
Run Code Online (Sandbox Code Playgroud)

5.脚本加载DOM(是)和立即评估的脚本块(即)

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

但仍有一个问题.页面大多数时间不使用完整URL.所以当脚本或元素引用stuff.phpPhantomJS时无法请求它.当page.content设置,然后在网页URL本质上是关于:空白和不完整的URL的所有请求指向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();
    }
});
Run Code Online (Sandbox Code Playgroud)

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