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

问题描述 投票:0回答:3

构建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
3个回答
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,......


0
投票

明显的解决方案:

//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过滤结果。


0
投票

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

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

(//a[contains(@href,'about')]/@href)[0]
© www.soinside.com 2019 - 2024. All rights reserved.