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 : 如何链接来自不同子目录的目标文件并包含不同的搜索路径