如何在Nokogiri中使用XPath?

时间:2010-01-17 11:27:11

标签: ruby xpath nokogiri

我没有找到任何文档或教程。有什么相似的吗?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

上面的代码会在任何地方为我提供任何tabletbody子项,其属性id等于“threadbits_forum_251”。但为什么它从双//开始呢?为什么最后有/tr?有关详细信息,请参阅“Ruby Nokogiri Parsing HTML table II”。


有人可以告诉我如何使用Nokogiri提取hrefidaltsrc等等吗?

td[3]/div[1]/a/text()' <--- extracts text

如何提取其他内容?

2 个答案:

答案 0 :(得分:45)

似乎您需要阅读XPath Tutorial

您的//table/tbody[@id="threadbits_forum_251"]/tr表达意味着:

  • // - XML文档中的任何位置
  • table/tbody - 带一个带有tbody孩子的桌子元素
  • [@id="threadbits_forum_251"] - 其中 id属性等于“threadbits_forum_251”
  • tr - 并使用其tr元素

所以,基本上,你需要知道:

  • 属性以@
  • 开头
  • 条件进入[]括号

如果我理解了该API,如果只有一个doc.xpath("td[3]/div[1]/a")["href"]元素,您可以使用td[3]/div[1]/a/@href<a>

答案 1 :(得分:7)

你的XPath是正确的,你似乎回答了你自己的问题的第一部分(几乎):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

“上面的代码会给我任意表的tr,任何地方,它有一个tbody子,其属性id等于threadbits_forum_251”


//表示以下元素可以出现在文档中的任何位置。

最后

/tr表示获取匹配元素的tr节点。

您不需要逐个提取每个属性。只需在Nokogiri中获取包含所有四个属性的整个节点,然后使用以下命令获取属性:

theNode['href']
theNode['src']

theNode是你的Nokogiri Node对象。


编辑:

抱歉,我没有使用过这些库,但我认为XPath评估和解析是由Mechanize完成的。所以这就是你如何一次性获得整个元素及其属性。

doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end
相关问题