查找所有<a>s to who&#39;s href points to an image with XPath 1.0</a>

时间:2010-03-17 16:09:32

标签: javascript firefox xpath greasemonkey

首先,我可以假设所有以jpeg,jpg,bmp,png或gif结尾的网址都是图片,而其他网址则不是。

我想到了,并试了两个解决方案:

  • 匹配正则表达式。(jpe?g | bmp | png | gif)$
  • 使用ends-with分别检查每个

但是,似乎这些都不存在于XPath 1.0中,或者至少它们在Firefox中不存在(我正在编写一个greasemonkey脚本,所以它对于在Firefox中工作的路径非常重要。) / p>

对标题感到抱歉,SO没想到“在XPath 1.0中查找图像的所有链接”是否足够独特

4 个答案:

答案 0 :(得分:3)

虽然您要求使用XPath解决方案,但另一种方法是使用jQuery或Prototype之类的东西,它使用CSS选择器来选择元素。

例如,使用jQuery,您可以使用:

$("a[href$='jpg'],a[href$='gif'],a[href$='png']").each(functionOfChoice);

答案 1 :(得分:2)

您可以使用substringstring-length(两者中的 在XPath 1.0中)的组合来模拟ends-with。它不漂亮,但它有效:

substring(@href, string-length(@href) - 3 + 1, 3) = 'jpg'

3这里是jpg的长度; 1是为substring的基于1的索引进行调整)

应具有与

相同的真值
ends-with(@href, 'jpg')

我从您的问题中假设您知道如何分别检查每个可能的扩展名。

答案 2 :(得分:2)

XPath 1.0中没有正则表达式,并且没有ends-with()

URL不能包含空格而不会变为无效,因此您可以使用它们来实现字符串结束匹配。你可以这样做:

//a[
  contains(concat(@href, ' '), '.jpg ' or
  contains(concat(@href, ' '), '.bmp ' or
  contains(concat(@href, ' '), '.png '
]

或者这个(如@AakashM建议的那样):

//a[
  substring(@href, string-length(@href) - 2, 3) = 'jpg' or
  substring(@href, string-length(@href) - 2, 3) = 'bmp' or
  substring(@href, string-length(@href) - 2, 3) = 'png'
]

我认为后一种选择会表现得更好,而前者更短,更令人愉悦。如果您在这里迫切需要表现,则取决于此。

答案 3 :(得分:0)

这很难,因为XPath没有ends-with()函数,您需要使用它来检查相关文件扩展名的HREF属性的结尾。您将不得不使用substring-after()

它不会很漂亮,就像......

fn:substring-after(a[@href], '.') = 'jpg'

编辑substring-after似乎not a part of XPath 1.0,因此您必须使用甚至丑陋的 substringstring-length