2011-01-24 29 views
28

我試圖從xpath頁面獲取鏈接。問題是我只想要表格中的鏈接,但是如果我在整個頁面上應用xpath表達式,我將捕獲我不想要的鏈接。Python:在本地/特定元素上使用xpath

例如:

tree = lxml.html.parse(some_response) 
links = tree.xpath("//a[contains(@href, 'http://www.example.com/filter/')]") 

的問題是,應用表達整個文檔。我所在我想要的元素,例如:

tree = lxml.html.parse(some_response) 
root = tree.getroot() 
table = root[1][5] #for example 
links = table.xpath("//a[contains(@href, 'http://www.example.com/filter/')]") 

不過,這似乎是進行整個文檔的查詢爲好,因爲我還在捕捉表外的鏈接。 This page表示「當在元素上使用xpath()時,將根據元素(如果是相對值)或根樹(如果是絕對值)評估XPath表達式:」。那麼,我使用的是絕對錶達式,我需要使它成爲相對的?是嗎?

基本上,我該如何去過濾只存在於這個表格內的元素?

回答

47

您的xpath以斜槓(/)開頭,因此是絕對的。在前面加一個圓點(.),使其相對於當前元素即

links = table.xpath(".//a[contains(@href, 'http://www.example.com/filter/')]") 
+0

但是,如果我添加點,它似乎沒有遞歸搜索(因爲它只搜索該元素)。至少這就是我所認爲的,因爲過濾器在相對之後不再起作用。有沒有辦法讓它從那個元素以外進行搜索,而不是僅僅搜索它呢? – 2011-01-24 19:01:41

0

另一種選擇是直接問你的表內的元素。 例如:

tree = lxml.html.parse(some_response) 
links = tree.xpath("//table[**criteria**]//a[contains(@href, 'http://www.example.com/filter/')]") 

**criteria**如果在頁面許多表是必要的。一些可能的標準是根據表ID或類進行過濾。例如:

links = tree.xpath("//table[@id='my_table_id']//a[contains(@href, 'http://www.example.com/filter/')]")