我想删除一个HTML元素,或者只是在评估/渲染之前删除网页的前N个字符。
有没有办法做到这一点?
答案 0 :(得分:11)
这取决于多种情况。我只概述以下问题的答案的每个组合的步骤。
根据匹配的网址注册onResourceRequested
听众和request.abort()
。
只有当以下代码块不依赖于不应删除的代码时(这是不可能的),才能执行此操作。这很可能是在DOM中注册的点击事件所必需的。
在这种情况下取消请求,如 1。,通过XHR下载脚本,删除不需要的代码部分并向DOM添加代码块。为此,您需要禁用Web安全性,否则如果资源不在同一个域中,则无法请求资源:--web-security=false
。
onload
(ol)&可以完全删除(rc) 这可能非常容易出错。您将从page.onInitialized
回调开始与setInterval(function(){}, 5)
进行间隔。在间隔内,您需要检查是否在页面上下文中设置了window.onload
(或者您可以接触的其他内容)。如果确实是要删除的功能,请删除它,方法是选中window.onload.toString().match(/something/)
。
这可以直接在页面上下文中完成(在page.evaluate
内)。
onload
(ol)&还包含其他代码(nr)从 3。开始,但不是删除window.onload
,而是
eval("window.onload = " + window.onload.toString().replace(/something/,''))
您可以将页面加载为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();
}
});
除了简单的字符串替换之外,您可能希望研究正确的操作技术。