0

我在构建 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 解决方案。

我很感激任何建议!

提前谢谢了!

4

3 回答 3

0

XPath 1.0 的字符串操作能力非常有限,您只能基于一些假设来做到这一点。

例如,如果所有 URL 都以 . 结尾.asp,则搜索类似/about.asp或更一般的/about.. 一个非常肮脏的技巧是切断从 first 开始的所有内容?,只使用最后几个字符(允许不同长度的后缀,如.xhtmlor .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、...

于 2013-07-21T18:44:59.190 回答
0

显而易见的解决方案:

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

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

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

解释:“选择在其属性中包含且不包含任何after的任何<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 成功'/'

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

于 2013-07-21T18:46:43.870 回答
0

你还记得你用的是哪个浏览器吗?Internet Explorer 从 0 开始计算元素节点。

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

(//a[contains(@href,'about')]/@href)[0]
于 2018-02-28T21:12:54.037 回答