使用 XPath 遍历?

Traversing with XPath?

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

我读了这个post:
Selecting a css class with xpath

将第一个响应 "class" 选择器放入我的项目中,如..

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

效果很好。它 returns 对我来说是所有带有 class "attr-price" 的元素,我什至可以通过做...

来做类似复合选择器的事情
//*[contains(concat(" ", normalize-space(@class), " "), " attr-price second-class")]

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

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

这样我就找到了每个 UL 而不是每个元素,然后在那里搜索我的 class,有点像我使用 jQuery 的

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

欢迎任何意见,谢谢。

相当于

的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 属性恰好以正确的顺序 包含这两个 classes 时才有效。如果你想要一个不依赖于 classes 列出顺序的复合选择器(因为它不会在 CSS 中),你需要使用类似

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

这很笨重。 请记住,如果您可以访问 XPath 2.0,则可以改用 tokenize()。为此,请参阅