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

时间:2013-07-21 17:36:30

标签: 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解决方案。

我感谢任何建议!

非常感谢提前!

3 个答案:

答案 0 :(得分: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,......

答案 1 :(得分: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过滤结果。

答案 2 :(得分:0)

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

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

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