2011-01-24 31 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/')]")