Nokogiri和Xpath查询

时间:2012-07-06 17:53:00

标签: ruby xpath nokogiri

我在循环中有这个Xpath查询,

//div[@class='listing_content'][#{i}]/div/div/h3/a/text()

我想单独处理每个节点

问题是它给出了正确的节点,但是它们一次性全部出现。

同样在i > 1时,它什么都不返回?

for i in (1...30)
  name = page.xpath("//div[@class='listing_content'][#{i}]/div/div/h3/a/text()")
  puts "this is name"
  puts name

  #Get Business phone
  phone = page.xpath("//div[@class='listing_content'][#{i}]//span[@class='business-phone phone']/text()")
  puts "this is phone"
  puts phone

  #Get Business website(if any)
  puts "this is website"
  website = page.xpath("//div[@class='listing_content'][#{i}]//li[@class='website-feature']//@href")
  puts website
end

1 个答案:

答案 0 :(得分:2)

  

当我> 1,它什么都不返回?

这是XPath中第二大常见问题解答:

使用

(//div[@class='listing_content'])[#{i}]/div/div/h3/a/text()

观察到的行为的原因,在XPath中,[]的优先级(优先级)高于//伪运算符。

因此,在原始表达式中,您指定应选择其父项的div[@class='listing_content']个子i元素。

但是,在您正在使用的XML文档中,每个div[@class='listing_content']恰好是其父级的第一个(也是唯一的)子级 - 因此如果i > 1则没有选择任何内容。

与任何其他语言一样,为了覆盖默认优先级,我们必须使用括号。