3

我正在开发一个 chromium 扩展,因此我对我请求权限的域的 XMLHttpRequests 具有跨主机权限。

我使用了 XMLHttpRequest 并获得了一个 HTML 网页 (txt/html)。我想使用 XPath (document.evaluate) 从中提取相关位。不幸的是,我无法从返回的 html 字符串构造一个 DOM 对象。

var xhr = new XMLHttpRequest();
var name = escape("Sticks N Stones Cap");
xhr.open("GET", "http://items.jellyneo.net/?go=show_items&name="+name+"&name_type=exact", true);
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xhr.responseText,"text/xml");
    console.log(xmlDoc);
    }
}

xhr.send();

console.log是在 Chromium JS 控制台中显示调试内容。

在上述 JS 控制台中。我明白了:

Document
<html>​
<body>​
<parsererror style=​"display:​ block;​ white-space:​ pre;​ border:​ 2px solid #c77;​ padding:​ 0 1em 0 1em;​ margin:​ 1em;​ background-color:​ #fdd;​ color:​ black">​
<h3>​This page contains the following errors:​&lt;/h3>​
<div style=​"font-family:​monospace;​font-size:​12px">​error on line 1 at column 60: Space required after the Public Identifier
​&lt;/div>​
<h3>​Below is a rendering of the page up to the first error.​&lt;/h3>​
</parsererror>​
</body>​
</html>​

那么我想如何使用 XMLHttpRequest -> 接收 HTML -> 转换为 DOM -> 使用 XPath 来横向?

我应该使用“隐藏”iframe hack 来加载/接收 DOM 对象吗?

4

1 回答 1

3

DOMParser 对 DOCTYPE 定义感到窒息。它也会在任何其他非 xhtml 标记上出错,例如<link>没有关闭的/. 您可以控制正在发送的文件吗?如果没有,最好的办法是将其解析为字符串。使用正则表达式来查找您要查找的内容。

编辑:您可以通过将其注入隐藏的 div 来让浏览器为您解析正文的内容:

var hidden = document.body.appendChild(document.createElement("div"));
hidden.style.display = "none";
hidden.innerHTML = /<body[^>]*>([\s\S]+)<\/body>/i(xhr.responseText)[1];

现在在里面搜索hidden以找到您要查找的内容:

var myEl = hidden.querySelector("table.foo > tr > td.bar > span.fu");
var myVal = myEl.innerHTML;
于 2010-10-19T21:53:53.310 回答