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/