2010-01-17 38 views
21

我还没有找到任何文档或教程。有这样的事吗?如何在Nokogiri中使用XPath?


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

上面的代码会得到我的任何table,任何地方,有一个tbody孩子与属性id等于“threadbits_forum_251”。但为什么它以双重//开头?为什么最后有/tr?有关更多详细信息,请参阅“Ruby Nokogiri Parsing HTML table II”。


谁能告诉我怎么hrefidaltsrc等,采用引入nokogiri提取?

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

我该如何提取其他东西?

回答

41

看来你需要阅读XPath Tutorial

//table/tbody[@id="threadbits_forum_251"]/tr表达的意思是:

  • // - XML文档港九
  • ​​- 以表格元素与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 f只有一个<a>元素。

+0

@Rubens谢谢你。你是对的我需要阅读XPath Tutorial.I认为这是我需要阅读的nokorigi文档...你知道是否有任何工具可以给我完整的Xpath,如果我点击并在HTML页面上的对象? – Radek 2010-01-17 11:50:58

+8

我不知道,但XPath并不那么辛苦;考虑你的文件系统,并假设每个文件夹都是一个XML元素;所以,当你选择你的'system32'文件夹时,你会得到'\ windows \ system32'路径;只需用'/'替换'\\'',考虑以'@'开头的属性和'']'的条件,你很好去 – 2010-01-17 12:01:48

+2

我知道这是一个较老的答案,但是xpath教程的链接是现在打破了。我认为现在应该是http://www.w3schools.com/xsl/xpath_intro.asp – Axiombadger 2016-02-17 13:06:41

6

你的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的评估和分析正在由机械化完成。因此,您将如何一次性获得整个元素及其属性。

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

@Anurag谢谢你的好解释。我使用机械化不是纯粹的nokogiri,我可以用[:href']莫名其妙[:title, 'TD [3]/DIV [1] /一个/文本()'] ,?我想提取href而不是文本 – Radek 2010-01-17 11:48:57

+1

'[:address,'td [3]/div [1]/a/@ href']'? – 2010-01-17 11:51:48

+0

我正在寻找nokogiri教程,并遇到了我自己的答案..呵呵:) – Anurag 2011-04-21 19:32:19