如何在Nokogiri中使用XPath?

Rad*_*dek 25 ruby xpath nokogiri

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


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
Run Code Online (Sandbox Code Playgroud)

上面的代码会让我任何table地方都有一个tbody属性id等于"threadbits_forum_251" 的子节点.但为什么从双开始//呢?为什么/tr最后呢?有关更多详细信息,请参阅" Ruby Nokogiri解析HTML表II ".


谁能告诉我如何提取href,id,alt,src,等,采用引入nokogiri?

td[3]/div[1]/a/text()' <--- extracts text
Run Code Online (Sandbox Code Playgroud)

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

Rub*_*ias 45

似乎您需要阅读XPath教程

你的//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>元素.

  • 我不知道,但XPath并不那么难; 考虑你的文件系统,并假设每个文件夹都是一个XML元素; 所以,当你选择`system32`文件夹时,你会得到`\ windows\system32`路径; 只需用`/`替换'\\``,考虑以`@`开头的条件和用`[]`开始的条件,你就好了 (8认同)
  • 我知道这是一个较旧的答案,但是xpath教程的链接现在已经破了.我认为现在应该是http://www.w3schools.com/xsl/xpath_intro.asp (2认同)

Anu*_*rag 7

你的XPath是正确的,你似乎已经回答了你自己的问题的第一部分(差不多):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
Run Code Online (Sandbox Code Playgroud)

"上面的代码会在任何地方给我任何表格的tr ,它有一个tbody子节点,其属性id等于threadbits_forum_251"


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

/tr最后意味着,获取tr匹配元素的节点.

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

theNode['href']
theNode['src']
Run Code Online (Sandbox Code Playgroud)

theNode你的Nokogiri Node对象在哪里?


编辑:

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

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