javascript - 使用 Firefox 解析 HTML

标签 javascript firefox dom xul

uri = 'http://www.nytimes.com/';
searchuri = 'http://www.google.com/search?';
searchuri += 'q='+ encodeURIComponent(uri) +'&btnG=Search+Directory&hl=en&cat=gwd%2FTop';
req = new XMLHttpRequest();
req.open('GET', searchuri, true);
req.onreadystatechange = function (aEvt) {
    if (req.readyState == 4) {
        if(req.status == 200) {
            searchcontents = req.responseText;
            myHTML = searchcontents;
            var tempDiv = document.createElement('div');
            tempDiv.innerHTML = myHTML.replace(/<script(.|\s)*?\/script>/g, '');
            parsedHTML = tempDiv;
            sitefound = sc_sitefound(uri, parsedHTML);
        }
    }
};
req.send(null);

function sc_sitefound(uri, parsedHTML) {
    alert(parsedHTML);
    gclasses = parsedHTML.getElementsByClassName('g');
    for (var gclass in gclasses) {
        atags = gclass.getElementsByTagName('a');
        alert(atags);
        tag1 = atags[0];
        htmlattribute1 =  tag1.getAttribute('html');
        if (htmlattribute1 == uri) {
            sitefound = htmlattribute1;
            return sitefound;
        }

    }
    return null;
}

parsedHTML 是一个 XULElement
gclasses 是一个 HTMLCollection

如果 Google Directory 搜索结果中有很多 G 类的 div,为什么 g 类为空?

最佳答案

var tempDiv = document.createElement('div');

如果您处于 XUL 环境中,则不会创建 HTML 元素节点:它将是一个 XUL 元素。自 innerHTML属性(property)专属于HTMLElement而不是其他 XML Element ​s,设置innerHTML on tempDiv 不会执行任何操作(除了添加包含 HTML 字符串的自定义属性之外)。因此,tempDiv 内部不存在类为“g”的元素...其中根本没有元素。

如果您在浏览器中加载了纯 HTML 文档,您可以尝试使用 content.document.createElement获取一个 HTML 包装元素,其 innerHTML将可用。这仍然不是解析整个 HTML 页面的好方法,因为相关文档可能有 <head>不能放入 div 中的内容以及将被丢弃的 HTTP header 。将目标文件加载到其自己的 HTMLDocument 对象中可能会更好。一个好方法是使用 iframe 。请参阅this page了解这两种方法的示例。

tempDiv.innerHTML = myHTML.replace(/<script(.|\s)*?\/script>/g, '');

使用正则表达式处理 HTML 有七种不好的想法;当谷歌稍微改变他们的页面标记时,这可能会在很多方面出现问题。让浏览器来完成解析工作。设置innerHTML不会导致脚本元素立即执行(但可以进行进一步的 DOM 操作);如果需要,您可以稍后挑选出不需要的脚本元素。使用 XUL iframe 方法,您可以简单地禁用 iframe 上的 JavaScript。

for (var gclass in gclasses) {

for...in循环用于针对用作映射的对象。它不应该用于迭代序列(例如 Array、NodeList 或本例中的 HTMLCollection),因为它不会执行您可能期望的操作。对于迭代序列,请坚持标准 C 风格 for (var i= 0; i<sequence.length; i++)循环。

您还可以添加 var所有其他局部变量的声明。

关于javascript - 使用 Firefox 解析 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255754/

相关文章:

ubuntu - 为什么在 ubuntu 18.04 上的 Firefox 上没有加载谷歌字体?

jquery - 访问动态变化的图像源

javascript - 如何在 JavaScript 中使用 DOMParser 读取子元素的属性

javascript - jQuery each() 不会迭代所有元素

firefox - 在 Firefox 和 Chrome 中查看来自 WCF 数据服务的原始 XML

javascript - 如何在javascript中获取选择值?

javascript - appendTo 插入窗口并向下滚动?

javascript - 如何检查元素是否隐藏在 jQuery 中?

javascript - Vuejs : Dynamic Recursive components

javascript - JavaScript 中父对象知道它的子对象吗?