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