如何在Nokogiri中使用XPath?
我没有找到任何文档或教程。 这样的事情存在吗?
doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
上面的代码将为我提供任何table
,其中有一个tbody
子节点,其属性id
等于“threadbits_forum_251”。 但为什么它从双//
开始? 为什么最后有/tr
? 有关更多详细信息,请参阅“ Ruby Nokogiri解析HTML表II ”。
任何人都可以告诉我如何使用Nokogiri提取href
, id
, alt
, src
等?
td[3]/div[1]/a/text()' <--- extracts text
我怎样才能提取其他东西?
似乎你需要阅读XPath教程
你的//table/tbody[@id="threadbits_forum_251"]/tr
表达式意味着:
-
//
– XML文档中的任何位置 -
table/tbody
– 带一个tbody child的table元素 -
[@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
如果只有一个元素。
你的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 节点对象。
编辑:
对不起,我没有使用过这些库,但我认为XPath评估和解析是由Mechanize完成的。 所以这就是你如何一次性获得整个元素及其属性。
doc.xpath("td[3]/div[1]/a").each do |anchor| puts anchor['href'] puts anchor['src'] ... end