xpath语法绝对和相对 xpath是绝对定位还是相对定位
lt;pgt;子轴(或/)只搜索直接子节点,而//会投票搜索所有子代节点;例如在div下,/p仅选中直接子元素的p,而//p会选中所有体系的p,包括在span内的p;1. 当结构明确、需精确控制体系或追求性能时,应采用子轴(/);2. 当结构不确定、需全局搜索或从当前节点尖端查找时,//更合适;3. 为提升性能,应先用/代替//,结合id、类名或属性限定范围,避免无限制的//起始查询,以减少耗费开销。lt;pgt;lt;pgt;XPath中的子登录后复制登录后复制轴和//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,核心区别在于它们的搜索范围和深度。子登录后复制登录后复制登录后复制轴(或者更常)见的隐式表示/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登记录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制首导航当前节点下的所有子元素,无论系统有多深,甚至可以从文档的根部开始搜索。解决方案lt;pgt;从我个人的经验来看,这理解两者的差异,首先要明白XPath的“轴”(axis)概念。子登录后复制登录后复制登录后复制是一个明确的轴,它表示当前节点的“直接子节点”。比如,如果你有一个lt;divgt;登录后复制,里面直接包含了lt;pgt;登录后复制作登录后复制登录后复制登录后复制登录后复制登录后复制和lt;spangt;登录后复制登录后复制,那么子::pon登录后复制登录后复制可选择选中的那个;pgt;登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制。而//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制一个简写,它代表了后代或后代lf::node()后复制的任意位置选择,意味着它会从当前上下文节点(如果没有指定,通常是文档根节点)开始,向所有后代节点(包括自身)进行递归搜索,找到匹配的元素。lt;pgt;举个例子,假设我们有这样的HTML结构: lt;pgt;这是第一段。 lt;spangt;lt;pgt;这是诵读的第二段。 lt;pgt;第三段。登录后复制lt;pgt;如果您在div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制节点上使用子:p登录后复制登录后复制(更常见的/或者p登录后复制),就选这个中“这是第一段。”和“这是第三段。”这两个;pgt;登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制标签,因为是div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制的直接子元素。
但如果你使用//p登录后复制登录后复制,那么它会选中这三lt;pgt;登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制标签:第一段、样式的第二段和第三段。因为它会深入到lt;spangt;登录后复制登录后复制内部去寻找匹配的lt;pgt;登录后复制登录后复制登录后复制登录后复制登录后复制后复制。 XPath路径中的“/”和“//”究竟差在哪里?lt;pgt;很多时候,我们其实很少直接写子::登录后复制登录后复制登录后复制登录后复制登录后复制,而是用/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制来代替。这个/登录后复制登录后复制来代替。制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,就是子::登录后复制登录后复制登录后复制登录后复制登录后复制轴的默认简写。所以,div/p登录后复制登录后复制和div/child::p登录后复制是等价的,它们都表示“在当前div登录后复制登录后复制登录后复制登录后复制登录复制后登录”这种方式的好处是路径清晰、明确,你知道你要找的元素必须是其父元素的直接子代。这种结构相对固定、结构明确的文档中非常有用,也更符合我们对“父子”的理解。lt;pgt;而//登录复制登录后复制登录后复制登录后复制它登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制则完全是另一种逻辑。它像一个“任意深度的搜索器”。当你写//p登录后复制登录后复制时,会从文档的任何位置(或者说,从你当前所在的相邻节点的任何子位置)去查找所有的lt;pgt;登录后复制登录这就好比你对一个大仓库说:“不管它在哪个角落,只要是箱子,都给我梳理来。”它会遍历所有可能的路径。这种便利性在处理结构不确定、或者你只关心某些特定类型的元素是否存在于文档中,而不关心其具体结构时布局非常坚固。比如,我经常用//a[@href]登录后复制来快速梳理页面上所有带链接的一点,不用关心它们是嵌在div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制里还是li登录后复制登录后复制里。什么时候该用“child:”,什么时候“//”更合适?lt;pgt;选择child::登录后复制登录后复制登录后复制登录后复制里。制(或/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制)还是//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,通常取决于你对文档结构的了解程度和对性能的需求。,通常取决于你对文档结构的了解程度和对性能的需求。
lt;pgt;我通常会在以下情况倾向于使用child::登录后复制登录后复制登录后复制登录后复制登录后复制(/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制):结构明确且稳定时:如果我知道某个并且稳定时div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制肯定下面会直接跟随一个p登录后复制登录后复制,而且这个结构不太可能波动,那么div/p登录后复制登录后复制就是最直接、最准确的选择。这能确保我只得到我想要的那一个,意外勾选细微痕迹的同名元素。精确控制系统时:当我只关心直接子元素,不希望符号搜索的系统时,/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制是唯一的选择。追求性能时:相对,/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录的搜索范围较小,只需要检查直接子节点,计算量通常远小于//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录在处理大型XML或HTML文档时,这种性能差异非常大。lt;pgt;//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,我会在这些场景中使用:结构不确定性变更时:如果某些元素可能出现在不同制度的页面中,或者引入代码模板经常导致系统不固定,用//登录后复制登录可以提供更好的健壮性。例如,我可能找到页面上需要所有包含特定内容的跨度制,而这些span登录后复制登录后复制可能在不同的div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制或lilog登录后复制登录后复制内部,东南亚//span[contains(text(),快速定位或全局搜索:当你确定某个类型的元素是否存在于文档中,或者想获取所有此类元素时,//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制能够让你快速到达目的,而分散其父元素是什么。从当前下游节点开始的核心搜索:比如,我已经定位到了一个特定的分区复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,现在我想在这个分区的各个细节找到某个img登录后复制,那么./img登录后复制(或者更简洁的.//img登录后复制)就比从根目录开始搜索要高效和精确修复。性能考量与最佳实践:XPath路径选择的那些“坑”lt;pgt;关于性能,这是一个真正在的“坑”。
无限制地使用//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,尤其是在大型文档上,可能会导致性能急剧下降,甚至造成程序卡顿。想象一下,如果你写了一个// di v登录后复制登录后复制来获取页面上所有的div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制,这实际上让XPath引擎遍历整个DOM树,检查每个节点是否是div登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制。如果页面体系深、节点多,这个操作的人力是巨大的。lt;pgt;我的经验是,尽量让你的XPath表达“更具体”。这意味着:能用/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制就不用/登记录限制后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制:如果结构允许,优先使用直接路径。结合ID或类名搜索范围:如果目标元素在一个有唯一ID的容器内,比如lt;div id=quot;main-contentquot;gt;登录后复制,那么就应该从这个ID开始,例如id(quot;main-contentquot;)//p登录后复制或//div[@id='main-content']/p登录后复制。这样//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制录后复制的搜索范围限制在了主内容登录后复制这个子树内部,最大限度减少了遍历的节点数。 利用已知属性进行筛选:不要只用标签名,排除加上属性限制,例如//input[@type='text' ] 登录后复制,这比简单的//输入登录后复制更准确,也可以使解析器更快地找到目标。避免引用的//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登复制登录后复制登录后复制登录后复制登录后复制登录后复制:除非你真的需要从文档的任何位置开始搜索,否则尽量避免以//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制底部,尤其是当你知道目标元素大致在哪个区域时。比如,如果我知道我要在body登录后复制里找的元素,那么html/body //div登录后复制通常会比//div登录后复制登录后复制效率更高。lt;pgt;一般,子::登录后复制登录后复制登录后复制登录后和//登录后复制登录后复制登录后复制登录后复制作登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制各有千秋,没有绝对的优劣,关键在于理解它们的劣势机制,并根据实际场景灵活选择。
就像我平时写爬虫,如果页面结构变化快,可能倾向于//登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制来增加健壮性;但如果是在一个内部系统,结构稳定,我一定会选择更精确、更高效的/登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制登录后复制路径。
以上就是XPath的子轴和//有什么区别?的详细内容,更多请关注乐哥常识网其他相关文章!
