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

2024-04-08

我想在评估/渲染网页之前删除 HTML 元素或简单地删除网页的前 N ​​个字符。

有什么办法可以做到这一点吗?


这取决于多种场景。我将仅概述以下问题的每种答案组合的步骤。

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

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

注册到onResourceRequested听众和request.abort()取决于匹配的 url。

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

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

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

3.脚本加载DOM(is)&JS通过onload(ol) & 可以完全移除 (rc)

这可能很容易出错。您将开始一个间隔setInterval(function(){}, 5) from a page.onInitialized http://phantomjs.org/api/webpage/handler/on-initialized.html打回来。在间隔内,您需要检查是否window.onload(或者你可以得到的其他东西)是在页面上下文中设置的。如果它确实是您要通过检查删除的功能,则将其删除window.onload.toString().match(/something/).

这可以在页面上下文(内部page.evaluate).

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

开始就像3.,但不是删除window.onload, 你可以做

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

5. 脚本与 DOM 一起加载 (is) 并立即评估脚本块 (ie)

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

但仍然存在一个问题。大多数时候页面不使用完整的 URL。因此,当脚本或元素引用时stuff.phpPhantomJS 无法请求它。当。。。的时候page.content设置后,页面 URL 本质上是 about:blank 并且所有 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();
    }
});

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PhantomJS 在评估之前更改网页内容 的相关文章

  • PhantomJS CPU(核心)受限吗?

    我开始做一些基于并行浏览器的测试 并想看看在达到 100 CPU 之前我可以在 EC2 大型机器上并行运行多少个浏览器 我正在使用 JMeter webdriver 插件来实际运行浏览器 对于 FireFox 实际上每个 CPU 核心有 1
  • 单击单选按钮时事件触发的顺序是什么?

    我知道这在浏览器之间是不同的 例如如果我将一个函数附加到单选按钮的 onclick 和 onchange 事件 然后单击它 Chrome 会触发 onchange 然后触发 onclick 而 Firefox 则会执行相反的操作 是否有任何
  • 如何在 PhantomJS 中使用 JavaScript 检测网页上的声音?

    我需要检测带有横幅的网页中的所有声音 我怎样才能做到这一点 我查看 PhantomJS 但找不到浏览器声音的 API PhantomJS 1 x 和 2 不支持 Flash
  • onChange 事件在哪个权威规范中进行了详尽的定义?

    我有点惊讶地发现 html 文档中的 onChange 事件在文本输入或文本区域上触发 而不是在其值实际更改时触发 而是仅在焦点离开元素时触发 当然 如果其值已更改 所以我一直在寻找说明这一点的规范 但找不到 我可以找到数以百万计的教程来解
  • JavaScript 节点列表

    有没有办法连接 2 个 document getElementsByTagName 调用返回的 2 个 NodeList 比如说 我有以下代码 var inputs documentElement getElementsByTagName
  • 对登录 Instagram 的 PhantomJS 代码进行故障排除

    我编写了这个 PhantomJS 脚本来自动登录 Instagram 它可以成功填写表单字段并按提交按钮 但它总是被重定向回登录屏幕并显示以下消息 你的用户名或密码不正确 我 100 确信凭据是正确的 并且我用多个 Instagram 帐户
  • 从 Javascript 读取当前文档的大小

    我开始玩回旋镖 https github com yahoo boomerang用于测量性能 这是非常有前途的 虽然它允许我测量延迟 带宽和页面加载时间 但我也有兴趣尝试获取在服务器端渲染初始 HTML 页面所需的时间 虽然记录浏览器开始解
  • Jsoup遍历DOM树时节点哈希码冲突

    我正在使用 java jsoup 构建 HTML DOM 树 其中Node hashCode 用来 但我发现在遍历DOM树时存在很多哈希码冲突 使用以下代码 doc traverse new NodeVisitor Override pub
  • IE 因在闭包中引用 DOM 元素而导致内存泄漏?

    在最近的一次采访中 有人问我 像这段代码一样 在引用 DOM 元素时使用闭包有什么危险 var firstNameValue function elementId var firstName document getElementById
  • 在针对 XSD 进行验证时,使用 DOM、StAX、SAX 解析器中的任何一个来查找 XML 中确切缺失的元素

    我有一个 XML 文件及其相应的 XSD 文件 在使用 StAX 解析器进行验证时 我附加了一个错误处理程序 基本上 我在格式良好的 XML 文件中遇到两种类型的错误 1 元素内的数据类型不正确 例如元素内的字符串应该具有整数 2 缺少元素
  • 从 org.w3c.dom.Node 获取 Xpath

    我可以从 org w3c dom Node 获取完整的 xpath 吗 假设当前节点指向 xml 文档中间的某个位置 我想提取该元素的 xpath 我正在寻找的输出 xpath 是 parent child1 chiild2 child3
  • Safari 的 Javascript 与 document.write 的问题

    我的问题只发生在 Safari 上 IE FF Chrome 和 Opera 都可以完美运行 我正在向 DOM 添加一个对象 与 YouTube 的方式完全相同 具体取决于 ActiveX 或 NPAPI 因此在确定写入对象类型后 我通过以
  • PhantomJS 无法打开 HTTPS 站点

    我使用以下基于 loadspeed js 示例的代码来打开一个 https 站点 该站点也需要 http 服务器身份验证 var page require webpage create system require system t add
  • jQuery 模式窗口从我的表单中删除元素

    jQuery 当我用它创建一个包含表单元素的模式窗口时 当我提交表单时 它会取出这些元素 表格示例
  • 不可靠/不稳定的 Capybara/AngularJS 集成测试与计时问题

    如何使这些测试可靠地通过 目前这些测试很不稳定 有时他们会过去 有时他们会失败 下面是演示此问题的设置 代码和输出 克服这个问题的建议将不胜感激 我相信也会帮助许多其他人 所以请发表评论 测试代码环境 轨道3 2 RSpec 2 x 水豚
  • jQuery 在附加元素后立即返回 div 元素的高度 0

    我有一个浮动 div 最初没有内容 我使用 jQuery 将一组元素附加到 div 然后立即调用原始 div 的 height 方法 我添加的元素在样式表中具有定义的最小高度 而浮动 div 则没有 问题是 当我在原始 div 上调用 he
  • 将 PhantomJS 调用中的变量暴露给injectJS

    我已经按照从入门页面注入 jQuery 的示例进行操作 效果很好 我在同一目录中有一个 jQuery 的本地副本 并执行类似的操作 if page injectJs jquery min js page evaluate function
  • Rangy:插入符号下的单词(再次)

    我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器 基本上 我需要能够插入人员 标签引用 例如 Twitter Github Facebook 我发现一些人试图实现同样的事情的代码 http jsfiddle net A
  • 我如何使用 querySelector() 选择具有双类的元素

    当我想使用 querySelector 选择元素时遇到问题 ul class xoxo blogroll ul 我怎样才能选择它ul元素 在我的代码中我像这样使用 var list document body querySelector u
  • 窗口大小调整触发的 DOM 事件

    我有一个布局相当复杂的页面 最初打开页面时 某些元素的对齐存在问题 但是 可以通过更改浏览器窗口的大小来 永久 解决此问题 显然 我不希望用户必须调整浏览器窗口的大小才能使页面正确显示 所以我想知道是否有一种方法可以在页面首次加载时以编程方

随机推荐

  • 关闭连接是最终确定最佳实践吗? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么要实现finalize https stackoverflow com questions 158174 why would you ever implement finalize 我看到一些j
  • 将字符串转换为内存流 - 内存流不可扩展?

    我试图将一个字符串写入内存流 但失败并出现错误消息 Memory stream is not expandable 产生此问题的代码行 context Response Filter new System IO MemoryStream S
  • ViewPager onPageSelected 为第一页

    因此 当使用 ViewPager 时 不会为第一页调用 onPageSelected 侦听器 问题与this http code google com p android issues detail id 27526 我有一些逻辑为当前选定
  • Vim:突出显示每种文件类型的 TODO 一词

    我想在 vim 中突出显示 TODO 这个词 无论编辑什么文件 代码或普通文本 它目前适用于许多不同的语言 例如 默认情况下 TODO 在 C Java 注释中突出显示 但我将 vim 用于非代码文本文件 并且我希望看到它们也突出显示 TO
  • 使用 Hibernate 预防 SQL 注入

    我有一个现有的代码 其中应用程序根据许多条件生成不同的 sql 并通过 hibernate 会话 createSQLQuery 执行它们 在这里 参数与驻留在 java 类中的 sql 字符串连接 作为普通字符串替换 现在的问题是我需要防止
  • 运行 fatjar 时无法加载 log4j2

    我正在开发一个使用 log4j2 日志记录的项目 在 intellij 中开发时 一切正常 并且日志记录按预期完成 log4j2 xml 通过在启动时通过 intellij 设置传递给 jvm 的 java 属性进行链接 但是一旦我尝试运行
  • 如何在 GKE 上配置 Ingress 请求超时

    我目前在 GKE k8s 1 2 上配置了一个 Ingress 用于将请求转发到我的应用程序的 Pod 我有一个可能需要很长时间的请求 30秒 和我的应用程序超时 504 我观察到 这样做时 我收到的响应不是我自己的 504 而是来自看起来
  • 机架 Web 服务器和 https:教程?

    任何人都可以提供使用 Ruby RACK Web 服务器处理 https 和 installint 证书等设置的描述或教程的链接吗 Thanks Rack 不是网络服务器 它是网络服务器 如 Apache nginx 和应用程序中间件之间的
  • 我可以获得`FILE*`的访问模式吗?

    我必须复制一个FILE Mac OS X 上的 C 语言 使用 POSIXint不幸的是 文件描述符一直是不可能的 所以我想出了以下函数 static FILE fdup FILE fp const char mode int fd fil
  • iPhone X中为什么页面推送动画Tabbar上移

    我构建了一个应用程序演示 在推送动画中使用 hidesBottomBarWhenPushed 隐藏 Tabbar But When I click Jump Button Tabbar move up like this VoidLess
  • 用于具有数字签名的 WSSecurity 的 SOAPHandler

    我正在尝试在 java 中创建一个 Soap 客户端 我必须使用我的私钥对 Soap 消息进行签名 我正在使用得到回复SoapUI with WS Security配置 我已导入 WSDL 并使用生成的类wsimport 我创建了一个SOA
  • 要安装 OpenType 字体,Windows 有哪些要求?

    利基编程问题 我正在通过字节制作来开发 OpenType 字体 而不是使用 Fontlab 或 FontForge 等设计工具 现在有一个自定义 OpenType CFF 字体 它实现了 Basic Latin unicode 块的子集 特
  • 让宏定义为函数返回值是不好的做法吗?

    使用定义为有条件返回值的宏有一个缺点 即仅查看客户端代码可能会在宏处退出 这一点并不明显 我正在考虑的用例是编写值和错误检查 如下所示 define WRITE CHK file param if write that returns ze
  • POST 请求中的 %5B 和 %5D 代表什么?

    我正在尝试编写一个Java 类来登录某个网站 登录的POST请求中发送的数据是 user 5Blogin 5D username user 5Bpassword 5D 123456 我很好奇是什么 5B and 5D意味着在钥匙用户登录 我
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • 在 PL/SQL 存储过程中拆分逗号分隔的字符串

    我有 CSV 字符串 100 01 200 02 300 03 我需要将其传递给 Oracle 中的 PL SQL 存储过程 在过程中 我需要将这些值插入表中的数字列中 为此 我从这里得到了一个工作方法 如何在 oracle 9i 中最好地
  • PHP MYSQL - 根据行号是否匹配行号填充 HTML 表编号行

    所以 基本上我正在尝试制作数据中心驾驶室图 我们有一个 Excel 电子表格 但它不容易更新 也不容易搜索 我的 MySQL 数据库中有三个表 数据库是 机架 表格是 机柜 设备和数据中心 每个表格中的每一行代表它是什么 机柜表有一列指定其
  • 如何中断无限循环

    虽然我知道这样问有点傻 但我仍然想更多地了解它的技术角度 无限循环的一个简单示例 public class LoopInfinite public static void main String args for System out pr
  • 使用 Iframe 的自定义用户代理

    是的 我已经读过使用不同的用户代理加载 iframe 内容 https stackoverflow com questions 12845445 load iframe content with different user agent但我
  • PhantomJS 在评估之前更改网页内容

    我想在评估 渲染网页之前删除 HTML 元素或简单地删除网页的前 N 个字符 有什么办法可以做到这一点吗 这取决于多种场景 我将仅概述以下问题的每种答案组合的步骤 是不是有一段JS叫做onload ol 或者脚本块立即被评估 ie 它是内联