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 文件中并尝试一下 :-)
这不是完整的源代码。正如您所指出的,不在<html>
和</html>
之间的所有内容都不会被包括在内。 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 行应该如下所示:
<<span class="start-tag">HTML</span>>
所以strip_tags() 之后就变成了:
<HTML>
在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:获取页面源代码的主要内容,如果未能解决你的问题,请参考以下文章