我没有找到任何文档或教程。有什么相似的吗?
doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
上面的代码会在任何地方为我提供任何table
个tbody
子项,其属性id
等于“threadbits_forum_251”。但为什么它从双//
开始呢?为什么最后有/tr
?有关详细信息,请参阅“Ruby Nokogiri Parsing HTML table II”。
有人可以告诉我如何使用Nokogiri提取href
,id
,alt
,src
等等吗?
td[3]/div[1]/a/text()' <--- extracts text
如何提取其他内容?
答案 0 :(得分:45)
似乎您需要阅读XPath Tutorial
您的//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>
。
答案 1 :(得分:7)
你的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评估和解析是由Mechanize完成的。所以这就是你如何一次性获得整个元素及其属性。
doc.xpath("td[3]/div[1]/a").each do |anchor|
puts anchor['href']
puts anchor['src']
...
end