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目录搜索结果中的G类有很多div,为什么g类为空?

最佳答案

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


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

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

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


用正则表达式处理HTML有7种不好的想法。当Google略微更改其页面标记时,这可能会在许多方面出问题。让浏览器执行解析工作。设置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/

10-12 15:56