Ruby 如何在Nokogiri中使用XPath?

Ruby 如何在Nokogiri中使用XPath?,ruby,xpath,nokogiri,Ruby,Xpath,Nokogiri,我没有找到任何文档或教程。有这样的事吗 上面的代码将获得任何表,在任何地方,该表具有tbody子级,其属性id等于“threadbits\u forum\u 251”。但是为什么它以双/开头呢?为什么结尾有/tr?有关详细信息,请参阅“” 有人能告诉我如何使用Nokogiri提取href、id、alt、src等吗 td[3]/div[1]/a/text()' <--- extracts text td[3]/div[1]/a/text()”似乎您需要阅读 您的//table/tbod

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


上面的代码将获得任何
,在任何地方,该表具有
tbody
子级,其属性
id
等于“threadbits\u forum\u 251”。但是为什么它以双
/
开头呢?为什么结尾有
/tr
?有关详细信息,请参阅“”


有人能告诉我如何使用Nokogiri提取
href
id
alt
src
等吗

td[3]/div[1]/a/text()' <--- extracts text
td[3]/div[1]/a/text()”似乎您需要阅读

您的
//table/tbody[@id=“threadbits\u forum\u 251”]/tr
表达式表示:

  • /
    -XML文档中的任意位置
  • 表格/tbody
    -获取带有tbody子级的表格元素
  • [@id=“threadbits\u forum\u 251”]
    -其中id属性等于“threadbits\u forum\u 251”
  • tr
    -并获取其
    tr
    元素
所以,基本上,你需要知道:

  • 属性以
    @
  • 条件在括号内

如果我正确理解该API,您可以使用
doc.xpath(“td[3]/div[1]/a”)[“href”]
,或者
td[3]/div[1]/a/@code>,如果只有一个
元素。

您的xpath是正确的,并且您似乎已经回答了自己问题的第一部分(几乎):

“上面的代码将获取任何表的tr,anywhere,该表有一个属性id等于threadbits\u forum\u 251的tbody子级”


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

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

您不需要逐个提取每个属性。只需获取包含Nokogiri中所有四个属性的整个节点,并使用以下方法获取属性:

theNode['href']
theNode['src']
其中,
节点
是您的Nokogiri对象


编辑:

很抱歉,我没有使用这些库,但我认为XPath计算和解析是由Mechanize完成的。下面是如何一次性获得整个元素及其属性

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

@Anurag谢谢你的解释。我使用的是mechanize而不是纯nokogiri,我可以在[:title,'td[3]/div[1]/a/text()'中使用节点['href']吗,?我想提取href而不是text
[:address,'td[3]/div[1]/a/@href']
?我在搜索nokogiri教程,找到了我自己的答案。。呵呵:)Mechanize内部使用Nokogiri,所以它使用的是纯Nokogiri,就在幕后。Mechanize将解析页面的根目录作为Nokogiri文档返回。@Rubens谢谢。你是对的,我需要阅读XPath教程。我以为我需要阅读的是nokorigi文档。。。若我点击html页面上的object,你们知道有并没有什么工具可以为我提供完整的Xpath?我不知道,但Xpath并没有那个么难;考虑你的文件系统,让我们假设每个文件夹都是XML元素;因此,当您选择
system32
文件夹时,您将获得
\windows\system32
路径;只需按<代码> > /<代码>替换“<代码> >代码>,考虑从<代码> <代码>开始的属性和条件,通过<代码> []/COD> >您很好,我知道这是一个较老的答案,但是到XPath教程的链接现在被打破了。“我想现在应该修好了,”獾说!
theNode['href']
theNode['src']
doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end