Firefox 扩展和 XUL:获取页面源代码

Posted

技术标签:

【中文标题】Firefox 扩展和 XUL:获取页面源代码【英文标题】:Firefox extensions & XUL: get page source code 【发布时间】:2011-01-21 05:27:22 【问题描述】:

我正在开发我的第一个 Firefox 扩展,为此我需要获取当前页面的完整源代码。我如何使用 XUL 做到这一点?

【问题讨论】:

【参考方案1】:

您需要一个 xul browser 对象来加载内容。

将页面的“view-source:”版本加载到浏览器对象中,与“查看页面源代码”菜单的方式相同。请参阅chrome://global/content/viewSource.js 中的函数 viewSource()。该函数可以从缓存中加载,也可以不加载。

加载内容后,原始来源由以下方式给出:

var source = browser.contentDocument.getElementById('viewsource').textContent;

序列化 DOM 文档 此方法不会获取原始出处,但可能对部分读者有用。

您可以将文档对象序列化为字符串。请参阅 MDC 中的 Serializing DOM trees to strings。您可能需要在扩展中使用替代的实例化方法。

那篇文章讨论的是 XML 文档,但它也适用于任何 html DOMDocument。

var serializer = new XMLSerializer();
var source = serializer.serializeToString(document);

这甚至适用于网页或萤火虫控制台。

【讨论】:

这看起来也很完整。但是,如果 XHTML 由于某些错误而损坏,会发生什么? DOM 解析器已经处理了损坏的 HTML,所以 seriaizer 不会看到损坏的源代码。 那可能会很糟糕? document 变量是否也具有 textContent 属性? 您的编辑看起来非常有趣。如果这行得通,应该就是这样。 我正在尝试这个解决方案,到目前为止它似乎运行良好!谢谢拉克兰! @Franz 我认为创建一个新的 (document.createElement('browser')) 应该可以,但您也可以将它放在您的主覆盖 XUL 中:<browser id="invisibleBrowser" collapsed="true"/> <!-- This is never actually shown. It's just used for getting the raw source of HTML pages --> 然后当然,在您的 js 文件中:var browser = document.getElementById('invisibleBrowser')【参考方案2】:

看起来确实没有办法获得“所有源代码”。你可以使用

document.documentElement.innerHTML

获取顶部元素的innerHTML(通常是html)。如果您有类似

php 错误消息
<h3>fatal error</h3>
segfault

<html>
    <head>
        <title>bla</title>
        <script type="text/javascript">
            alert(document.documentElement.innerHTML);
        </script>
    </head>
    <body>
    </body>
</html>

innerHTML 是

<head>
<title>bla</title></head><body><h3>fatal error</h3>
segfault    
        <script type="text/javascript">
            alert(document.documentElement.innerHTML);
        </script></body>

但错误信息仍会保留

edit:documentElement 在这里描述: https://developer.mozilla.org/en/DOM/document.documentElement

【讨论】:

这可能是我正在寻找的。但是,我不明白您发布的示例代码。第二个块应该是第一个块中通过alert 打印的文本吗?如果是这样,为什么错误信息会突然出现在body标签内? 是的,第二个代码块是被警告的代码。那可能是firefox的代码更正。只需将第一个块复制到一个空的 html 文件中并尝试一下 :-) 这不是完整的源代码。正如您所指出的,不在&lt;html&gt;&lt;/html&gt; 之间的所有内容都不会被包括在内。 Lachlan 的回答似乎是一个更好的解决方案。【参考方案3】:

您可以使用var URL = document.location.href 获取URL 并导航到"view-source:"+URL

现在您可以获取整个源代码(viewsource 是正文的 id):

var code = document.getElementById('viewsource').innerHTML;

问题是源代码被格式化了。所以你必须运行strip_tags() 和htmlspecialchars_decode() 来修复它。

例如,第 1 行应该是文档类型,第 2 行应该如下所示:

&lt;<span class="start-tag">HTML</span>&gt;

所以strip_tags() 之后就变成了:

&lt;HTML&gt;

在htmlspecialchars_decode() 之后我们终于得到了预期的结果:

<HTML>

代码不会传递给 DOM 解析器,因此您也可以查看无效的 HTML。

【讨论】:

嗯...听起来不错。整个代码是否包含在 ID 为 viewsource 的元素中,或者您为什么要这样做? “格式化”是什么意思?实体逃脱了吗? 将其视为普通的 HTML 代码。身体 id 是 viewsource。我已经添加了它的外观示例。我希望您对如何访问此页面有一些想法(例如,您可以使用隐藏的 iframe)。 或者你可以直接使用.textContent @Eli:嗯? @Sagi:啊,谢谢你的解释。我今晚试试这个。 Franz:你不需要所有这些。只需使用document.getElementById('viewsource').textContent【参考方案4】:

也许你可以通过 DOM 获取它,使用

var source =document.getElementsByTagName("html");

并使用 DOMParser 获取源代码

https://developer.mozilla.org/En/DOMParser

【讨论】:

getElementsByTagName(注意:元素)【参考方案5】:

Sagi 回答的第一部分,但请改用document.getElementById('viewsource').textContent

【讨论】:

【参考方案6】:

更符合 Lachlan 的回答,但这里对内部结构的讨论非常深入,进入 Cpp 代码。

http://www.mail-archive.com/mozilla-embedding@mozilla.org/msg05391.html

然后按照底部的回复。

【讨论】:

以上是关于Firefox 扩展和 XUL:获取页面源代码的主要内容,如果未能解决你的问题,请参考以下文章

在 Firefox 扩展中使用 Extjs

响应工具栏扩展按钮单击打开 xul 文件

Firefox 扩展和 COM 组件之间的 IPC

XUL:如何包含和扩展另一个 .xul 文件?

如何编写 Firefox 插件? [关闭]

Firefox扩展Adblock Plus发布WebExtension版本