我正在寻找一种使用 xpath 获取内容的更快方法。
我读了这篇文章:
Selecting a css class with xpath
将第一个响应“class”选择器放在我的元素中,as..
//*[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')
欢迎任何意见,谢谢。
XPath 等同于
$('ul').find(...)
会是
//ul//...
所以你的 XPath 会变成
//ul//*[contains(concat(" ", normalize-space(@class), " "), " attr-price ")]
我猜这是否真的更快取决于 XPath 处理器和 DOM 模型实现。
换句话说,你的复合选择器
//*[contains(concat(" ", normalize-space(@class), " "),
" attr-price second-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
我是一名优秀的程序员,十分优秀!