gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:50:11 24 4
gpt4 key购买 nike

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

有没有办法做到这一点?

最佳答案

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

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

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

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

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

    这只能在以下代码块不依赖于不应删除的代码时才能完成(这不太可能)。这对于在 DOM 中注册的点击事件很可能是必需的。

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

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

    这可能很容易出错。您可以从 setInterval(function(){}, 5) 开始一个区间。来自 page.onInitialized 打回来。在区间内,您需要检查 window.onload (或其他你可以得到的东西)在页面上下文中设置。如果它确实是您想要删除的功能,请通过检查 window.onload.toString().match(/something/) 删除它。 .

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

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

    开始3. , 而不是删除 window.onload , 你可以做
    eval("window.onload = " + window.onload.toString().replace(/something/,''))

    5. 使用 DOM 加载脚本 (is) & 立即评估脚本 block (ie)

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

    不过还有一个问题。页面大部分时间不使用完整的 URL。所以当一个脚本或元素引用 stuff.php PhantomJS 无法请求它。当 page.content设置然后页面 URL 本质上是 about:blank 并且所有 URL 不完整的请求都指向 file:///... .显然没有这样的文件。这些资源必须替换为其完整的 URL 对应项。
    此类 URL 分为三种类型:
  • //example.com/resource.php可变协议(protocol)
  • /resource.php可变协议(protocol)和域
  • resource.php可变协议(protocol)、域和资源路径

  • 完整示例:
    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();
    }
    });

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

    关于dom - PhantomJS 在评估之前更改网页内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24834403/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com