我正在寻找一种更快的方法来使用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')
感谢您的任何意见,谢谢。
答案 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