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/