穿越XPath?

时间:2015-06-09 18:50:15

标签: html css xpath traversal

我正在寻找一种更快的方法来使用xpath获取内容。

我读过这篇文章:
Selecting a css class with xpath

提出第一批回复" class"我的项目中的选择器,如..

//*[contains(concat(" ", normalize-space(@class), " "), " attr-price ")]

效果很好。它返回给我所有带有类" attr-price"的元素,我甚至可以做类似复合选择器的事情......

//*[contains(concat(" ", normalize-space(@class), " "), " attr-price second-class")]

然而,我不喜欢的部分是// *。这使XPath遍历所有节点,并且显着降低了我的网站性能。我在W3schools上阅读了不同类型的选择器,并尝试使用/和//代替// *,但这些都不起作用。 attr-price元素都在<ul>范围内,想做一些类似的事情。

/ul/[contains(concat(" ", normalize-space(@class), " "), " attr-price ")]

这样我就可以点击每个UL而不是每一个元素,然后在那里搜索我的课程,就像我使用jQuery一样

$('ul').find('.attr-price')

感谢您的任何意见,谢谢。

1 个答案:

答案 0 :(得分:0)

XPath相当于

$('ul').find(...)

将是

//ul//...

所以你的XPath会变成

//ul//*[contains(concat(" ", normalize-space(@class), " "), " attr-price ")]

这实际上是否更快取决于XPath处理器和DOM模型实现,我想。

另一方面,您的复合选择器

//*[contains(concat(" ", normalize-space(@class), " "),
       " attr-price second-class")]
只有当class属性恰好包含正确顺序的这两个类时,

才会起作用。如果你想要一个不依赖于列出类的顺序的复合选择器(因为它不会在CSS中),你需要使用像

这样的东西。
//*[contains(concat(" ", normalize-space(@class), " "), " attr-price ")
 and contains(concat(" ", normalize-space(@class), " "), " second-class ")]

非常笨重。 请记住,如果您有权访问XPath 2.0,则可以使用tokenize()代替。为此,请参阅https://stackoverflow.com/a/12165195/423105

相关问题