javascript - 如何从通过 XMLHttpRequest 接收的 html 页面创建 DOM 对象?

标签 javascript domparser

我正在开发一个 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/

相关文章:

Javascript 回调方法不会更新 AngularJS,除非采用简写形式

javascript - 如何在 promise 链内返回promise.map(bluebird)?

java - 如何将值插入到 xml 标记中

php - 简单的 HTML DOM 解析器 - 发送 post 变量

javascript - 使用 ngResource(1.0.6 和 1.1.4)更改 POST 请求的内容类型时遇到问题

javascript - 无法通过 Javascript 保持 CSS 更改

java - 在android中使用dom解析器获取值列表

android - 使用 DOM 解析器和 SAX 解析器进行 Android XML 解析的区别

javascript - 移动设备上的全屏 Canvas

javascript - 为什么 DOMParser 不使用注册的 customElements?