XPath包含以特定类型的链接路径为目标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPath包含以特定类型的链接路径为目标相关的知识,希望对你有一定的参考价值。

构建XPath查询以返回我需要的URL类型时遇到很多困难。下面的XPath查询适用于大多数情况,但是,我一直在尝试调整它,因此它只返回实际页面名称包含“about”的URL,而不是在目录名中找到about的URL。

当前输出(差):

https://www.domain.com/about/account.asp

期望的输出:

https://www.domain.com/about/about.asp

XPath的

 (//a[contains(@href,'about')]/@href)[1]

注意:因为我使用的是php XPath引擎,所以我只能使用XPath 1.0解决方案。

我很感激任何建议!

提前谢谢了!

答案

XPath 1.0的字符串操作功能非常有限,你只能根据一些假设来做到这一点。

例如,如果所有网址都以.asp结尾,请搜索/about.asp或更通用的/about.之类的内容。一个非常肮脏的黑客将切断从第一个?开始的一切,只使用最后几个字符(允许不同长度的后缀,如.xhtml.pl)并在那里搜索:

[
  contains(
    substring(substring-before(., '?'), string-length(substring-before(., '?')) - 10),
   'about'
  ) or (
    not(contains(., '?')) and
    contains(substring(., string-length(.) - 10), 'about')
  )
]

这仍然应该扩展为哈希#代替?来获取大多数情况,但仍然有足够的它将失败。

我强烈建议使用PHP中的一些正则表达式,它将更加强大和方便。或者使用外部XPath 2.0 / XQuery处理器,如Saxon,BaseX,......

另一答案

明显的解决方案:

//a[contains(@href, '/about.asp')]

但假设你不想这样做,我认为不可能做你需要的。我得到的最接近的:

//a[contains(@href, 'about') and not(contains(substring-after(@href, 'about'), '/'))]

说明:“选择任何<a>元素,在其@href属性中,确实包含'about',并且在'/'之后不包含任何'about'。”

问题是,虽然它匹配https://www.domain.com/account/about.asp和它(正确)不匹配https://www.domain.com/about/account.asp,它也不匹配https://www.domain.com/about/about.asp,因为有一个"about"子串由'/'成功。

我认为,您可以做的最好的事情就是选择//a[contains(@href, 'about')],然后根据需要使用PHP过滤结果。

另一答案

你还记得你用过的浏览器吗? Internet Explorer计算以0开头的元素节点。

about.asp显然出现在account.asp之前,所以我会用这个:

(//a[contains(@href,'about')]/@href)[0]

以上是关于XPath包含以特定类型的链接路径为目标的主要内容,如果未能解决你的问题,请参考以下文章

makefile : 如何链接来自不同子目录的目标文件并包含不同的搜索路径

如何在打印(xpath)之前检查文本是不是包含特定字符?

如何使用 XPATH 访问 TR 内的链接

具有相同功能的活动和片段

xpath按元素和属性查找节点,其中包含具有特定id的子元素

HTML 的 XPath,只需要那些带有特定单词的元素