如何在Nokogiri中使用XPath?

我没有找到任何文档或教程。 这样的事情存在吗?


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

上面的代码将为我提供任何table ,其中有一个tbody子节点,其属性id等于“threadbits_forum_251”。 但为什么它从双//开始? 为什么最后有/tr ? 有关更多详细信息,请参阅“ Ruby Nokogiri解析HTML表II ”。


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

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

我怎样才能提取其他东西?

似乎你需要阅读XPath教程

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

  • // – XML文档中的任何位置
  • table/tbody – 带一个tbody child的table元素
  • [@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如果只有一个元素。

你的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 节点对象。


编辑:

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

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