我正在开发一个 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:</h3>
<div style="font-family:monospace;font-size:12px">error on line 1 at column 60: Space required after the Public Identifier
</div>
<h3>Below is a rendering of the page up to the first error.</h3>
</parsererror>
</body>
</html>
那么我应该如何使用 XMLHttpRequest -> 接收 HTML -> 转换为 DOM -> 使用 XPath 进行横向处理?
我应该使用“隐藏的”iframe hack 来加载/接收 DOM 对象吗?
最佳答案
DOMParser 对 DOCTYPE 定义感到窒息。它还会在任何其他非 xhtml 标记上出错,例如 <link>
没有关闭/
.您对发送的文件有控制权吗?如果没有,最好的办法是将其解析为字符串。使用正则表达式查找您要查找的内容。
编辑:您可以通过将正文注入(inject)隐藏的 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;
关于javascript - 如何从通过 XMLHttpRequest 接收的 html 页面创建 DOM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972880/