构建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解决方案。
我感谢任何建议!
非常感谢提前!
答案 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]