2015-06-09 133 views
0

我正在尋找更快的方式來抓取xpath的內容。使用XPath遍歷?

我看到這篇文章:
Selecting a css class with xpath

把第一回應 「類」 選擇在我的項目,如..

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

偉大的工程。它返回到我所有的類「ATTR價格」的元素,我甚至可以做這樣的事情做一個複合選擇..

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

不過,我不喜歡這樣做的部分是//*。這使XPath遍歷所有節點,並且正在顯着降低我的網站性能。我在W3school上閱讀了關於不同類型的選擇器的內容,並嘗試使用/和//而不是// *,但是這些都不起作用。該ATTR價格要素中的<ul>都希望做一些analagous到..

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

這樣我打各的UL的,而不是每一個元素,然後尋找我的班上有,善良像如果我使用jQuery的

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

任何投入表示讚賞,謝謝。

+0

您是在瀏覽器中運行它,還是在服務器端執行某些操作?在後一種情況下,您使用的是什麼技術? XPath處理器並不完全相同。 –

+0

我在Moovweb平臺上使用一種名爲氚的語言在代理上運行此操作 –

+0

在這種情況下,對不起,我幫不了你。 –

回答

0

相當於

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

的XPath將

//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

+0

謝謝LarsH,我很熟悉它需要按照正確的順序。我將檢查是否可以訪問xpath 2.0,如果可能的話,我認爲這是可行的。 –