2014-02-07 23 views
0

我在寫xpaths來選擇左側邊欄上每個類別下的所有鏈接: http://www.indexmundi.com/commodities/'>http://www.indexmundi.com/commodities/xpath - 根據一些文本獲取行數

我想逐個選擇每個類別下的鏈接。我寫了下面的xpath,它在某種程度上選擇了第一類(商品價格指數)下的鏈接。但我想知道如何選擇其他類別下的鏈接。我想在H3 THA添加一個檢查,如果是文本能源,計數和之前選擇的所有行,那麼如果H3文字飲料,計數和選擇能源和飲料之間的所有行

.//*[@ ID = 'dlCommodities']/tbody的/ TR [位置()<計數(以下同胞:: TR/TD/H3)-1]/TD /一個

這裏是另一個xpath: .//*[@ id ='dlCommodities']/tbody/tr [之前的兄弟姐妹:: tr/td/h3 [。 ='能量']和以下 - 兄弟:: tr/td/h3 [。 ='Beverages']]/td/a

它正在實現第二個要求,即在特定標題之間選擇行但缺少一個節點。

請幫我修復這些xpath或者建議一個更好的xpath。

感謝

+0

頁面實際上並不包含'tbody'元素,但是如果HTML被解析爲DOM,它們會被添加。考慮http://stackoverflow.com/questions/18241029/why-does-my-xpath-query-scraping-html-tables-only-work-in-firebug-but-not-the如果您遇到XPath問題包含「tbody」軸步驟的表達式。 –

回答

1

我理解你的實際問題爲:找到屬於定類別的所有環節。爲此,找到該類別,然後檢索下一個類別之前的所有元素。

如果您願意,您可以刪除換行符,爲了便於閱讀,我添加了它們。

//tr[td/h3="Energy"]/(self::tr, following-sibling::tr[ 
    . << //tr[td/h3="Energy"]/following-sibling::tr[td/h3][1] 
]) 

如果你沒有一個XPath 2.0兼容的處理器,你不能使用<<運營商,其測試節點順序(當前節點必須先下一類別)。一個XPath 1.0解決方案甚至略短,但在我看來,在可讀性更糟:

//tr[td/h3="Energy"] | //tr[td/h3="Energy"]/following-sibling::tr[ 
    ./preceding-sibling::tr[td/h3][1][td/h3="Energy"] and not(td/h3) 
] 

兩個查詢將選擇一個類別的所有節點;把它們統計成count(...)

+0

不幸的是,第一個xpath不適合我。除了一個節點之外,第二個xpath正確選擇所需的節點。它會丟失包含類別名稱的行並選擇下一個類別的第一行。 –

+0

永遠不要說「不爲我工作」,總是解釋爲什麼。你收到一條錯誤消息嗎?查詢是否產生錯誤的輸出?如果你沒有詳細解釋發生了什麼問題,沒有人能夠幫助你。關於缺少的第一項:我的壞,沒有意識到它與標題一起被包含在同一行。這也是爲什麼下一個類別的第一個項目被包含,也是固定的。查看編輯。 –

+0

我試過它在Firefox中的螢火蟲,我得到「無效的Xpath」錯誤。然後我嘗試在Scrapy xpath selector [link]中使用它(http://doc.scrapy.org/en/latest/topics/selectors.html#scrapy.selector.Selector。xpath),在這種情況下我也得到了相同的消息。 –