XPath 不适用于动态 HTML 文档

2024-01-02

注意:这个问题及其答案对于大多数/所有支持 XPath 的编程语言和库都有效,而不仅仅是 JavaScript!

使用以下代码创建一个非常简单的 HTML 页面(实际代码加载远程页面,但我试图将您的注意力集中在这里的主要问题上):

var dt = document.implementation.createDocumentType("html", "-//W3C//DTD HTML 4.01 Transitional//EN", "http://www.w3.org/TR/html4/loose.dtd");
var doc = document.implementation.createDocument("http://www.w3.org/1999/xhtml", "html", dt);
var src = "<head></head><body></body>";
doc.documentElement.innerHTML = src;

alert(doc.evaluate(".", doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue);
alert(doc.evaluate("/body", doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue);
alert(doc.evaluate("//body", doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue);
alert(doc.evaluate("/html", doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue);

首先alert()显示“[object HTMLDocument]”,其他alert()显示“空”。这是为什么?为了让 XPath 查询工作并让它找到 body 元素,我缺少什么?


EDIT:

  • 在示例中添加“//body”
  • 我想我应该提到我使用 Opera 12.17。有没有任何解决方法可以使我得到相同的结果?

第一个 XPath 选择文档根(.是当前上下文)。

第二个为空,因为没有body在根上下文中。你可以使用:

/html/body

or

//body

这将为您提供节点。从那里,您可以使用上下文 XPath 表达式或 DOM 方法和属性获取上下文中的子节点。要查看节点名称,您可以使用nodeName您选择的节点上的属性:

doc.evaluate(".", doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null)
   .singleNodeValue.nodeName;
doc.evaluate("//body", doc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null)
   .singleNodeValue.nodeName;

JSFiddle 1 http://jsfiddle.net/helderdarocha/C6c7d/

此替代版本使用 DOM 来创建节点。

var head = document.createElement("head");
var body = document.createElement("body");
doc.documentElement.appendChild(head);
doc.documentElement.appendChild(body);

它还强制执行名称空间(在第一个示例中,Chrome 中会忽略该名称空间),因此 XPath 表达式需要包含名称空间映射函数(作为evaluate方法,或忽略它们(使用通配符和本地名称测试,如下例所示)。

doc.evaluate(".//*[local-name()='body']", doc.documentElement, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue.nodeName

请注意,我还使用了doc.documentElement作为上下文节点。

在浏览器中尝试一下:

JSFiddle 2 http://jsfiddle.net/helderdarocha/pSj78/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XPath 不适用于动态 HTML 文档 的相关文章

  • ReferenceError:regeneratorRuntime未定义(但在范围内工作)

    我遇到过这种奇怪的情况 ReferenceError regeneratorRuntime is not defined 我已经设法在一个非常小的设置中重现 与同一问题上的类似问题相比 并且还注意到一些奇怪的行为 具体取决于是否使用范围 以
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • Xcode 8 中的 Core Data Codegen 失败

    我有一个 iOS 应用程序 其中包含具有 6 个实体的核心数据模型 实体Name设置如下 班级名称 Name Module 当前产品模块 可待因 类定义 所有其他 5 个实体的设置类似 问题1 已自行修复 但留给后代 代码是在派生数据文件夹
  • 尝试将“zone.js”编译为外部模块,但它看起来像全局模块

    我有 AngularClass angular2 webpack starter 项目 我已经安装了所有 npm 依赖项 现在我正在尝试安装打字 打字 json dependencies zone js github gdi2290 typ
  • Typesafe 堆栈和 Scala 2.10 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 在 sca
  • Julia - 如何通过 WebSocket 订阅

    我想使用 Julia 使用 Websockets 订阅一些数据源 例如 从linux终端 我可以成功获取如下数据 wscat c wss www bitmex com realtime op subscribe args orderBook
  • CDI 事务管理:@Transactional 如何工作?

    在会话范围内有一个简单的 CDI bean 并注入了实体管理器 Named myBean SessionScoped public class MyBean implements Serializable private static fi
  • Vue模板如何禁止控制台登录?

    起源 log Vue prototype log console log 禁止场所
  • 在 Haskell 中从 Excel 读取数据

    我想从 xls 文件获取数据 而无需手动打开 Excel 一种可能性是使用 COM 自动化 有com 1 2 3 http hackage haskell org package com 1 2 3 and hdirect http hac
  • PHP比较二维数组

    我想知道如何比较两个二维数组的值 第一个数组 Array 1 0 gt Array 0 gt a 1 gt Array 0 gt b 2 gt Array 0 gt c 第二个 Array 2 0 gt Array 0 gt a 1 gt
  • 并非所有实例都在 Azure 应用服务中运行

    我正在使用 Azure 应用服务 它托管使用以下命令从事件中心读取数据的应用程序EventProcessorHost 我分配了 6 个实例 手动缩放 来运行 我检查了指标 CPU Time 在App Service中发现只有5个实例正在运行
  • JSON.NET Visual Studio 2008 和 .NET 3.5 紧凑框架

    我可以在 Visual Studio 2008 中使用 JSON NET 和 NET 3 5 Compact Framework 吗 如何在 IDE 中安装 配置它 我在网上搜索过但找不到 我找到了这个Visual Studio 2008
  • Elmah:如何从错误报告中获取 JSON HTTP 请求正文

    我正在使用 Elmah 来记录异常 如果请求是基于表单的请求 即 Content Type application x www form urlencoded 则 Elmah 非常擅长记录请求主体 但对于基于 JSON 的请求 其中内容类型
  • std::shared_ptr 初始化:make_shared() vs shared_ptr(new Foo) [重复]

    这个问题在这里已经有答案了 有什么区别 std shared ptr
  • 使用 javascript 从 div 获取值:始终未定义[重复]

    这个问题在这里已经有答案了 当我从 div 获取值时遇到这个问题 function sync var n1 document getElementById editor value alert n1 var n2 document getE
  • Spring Data JPA 与远程 MySQL 服务器的 ssh 隧道

    我使用 Spring Data JPA 和 Hibernate 作为持久性提供程序 并结合远程 MySQL5 服务器来执行定期复制内部数据子集的作业 该作业 即石英调度的 Java 应用程序 每天运行一次 大约需要30秒完成同步 出于安全原
  • Django 内联表单集和选择字段生成太多数据库查询

    我有一个包含许多外键字段的模型 例如具有 类型 级别 颜色 强度 字段的模型产品 只是一个通用示例 然后 我有一个页面可以使用类型表单编辑给定类型的所有产品 并将产品作为内联表单集 并可以选择添加其他内联产品extra 10 我觉得很奇怪的
  • 如何对二进制 Thrift 文件进行逆向工程?

    我被要求处理一些序列化为二进制的文件 不幸的是不是文本 JSON Thrift http incubator apache org thrift 对象 但我无权访问创建这些文件的程序或程序员 所以我不知道它们的结构 字段顺序等 有没有办法使
  • python:如何将列表中的每个值与另一个列表中的所有值相乘

    EDIT2 我已经删除了其余的代码 这样我就不会破坏解决方案 感谢您的帮助 编辑 我包含了我的整个代码 我不想包含它 因为我不想破坏任何自己尝试这个问题的人的解决方案 但我需要帮助 所以就在这里 我通过执行以下操作手动完成此操作 但我希望它
  • 等号(=) 和 IN 与子查询的区别

    我有一个查询需要 20 秒才能执行 请按照我的查询操作 SELECT MATLIGA COD MAT FAMILIA FROM ORCAMENTOS dbo OR 1INSUMOS INSUMOS INNER JOIN ORCAMENTOS
  • SQLite3和多进程

    当多个进程访问同一个SQLite数据库文件时 如何保证正确性 首先 避免并发访问sqlite数据库文件 并发性是 sqlite 的弱点之一 如果您有高度并发的应用程序 请考虑使用其他数据库引擎 如果您无法避免并发或删除 sqlite 请包装
  • XPath 不适用于动态 HTML 文档

    注意 这个问题及其答案对于大多数 所有支持 XPath 的编程语言和库都有效 而不仅仅是 JavaScript 使用以下代码创建一个非常简单的 HTML 页面 实际代码加载远程页面 但我试图将您的注意力集中在这里的主要问题上 var dt