使用Ruby / Mechanize(和Nokogiri)从HTML中提取单个字符串

我从论坛中提取数据。 我的脚本基于工作正常。 现在我需要从单个post中提取日期和时间(2009年12月21日,20:39)。 我无法让它发挥作用。 我使用FireXPath来确定xpath。

示例代码:

require 'rubygems' require 'mechanize' post_agent = WWW::Mechanize.new post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708') puts post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip puts post_page.parser.at_xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip puts post_page.parser.xpath('//[@id="post1960370"]/tbody/tr[1]/td/div[2]/text()') 

我的所有尝试都以空字符串或错误结束。


我找不到有关在Mechanize中使用Nokogiri的任何文档。 Mechanize文档在页面底部显示:

使用Mechanize导航到需要刮擦的页面后,使用Nokogiri方法刮取它。

但有什么方法呢? 我在哪里可以通过样本和解释语法阅读它们? 我也没有在Nokogiri的网站上找到任何东西。

拉德克。 我要告诉你如何钓鱼。

当您调用Mechanize::Page::parser ,它会为您提供Nokogiri文档。 所以你的“ xpath ”和“ at_xpath ”调用正在调用Nokogiri。 问题出在你的xpaths中。 通常,从最常用的xpath开始,然后缩小范围。 所以,例如,而不是这个:

 puts post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]/text()').to_s.strip 

从这开始:

 puts post_page.parser.xpath('//table').to_html 

这可以在任何地方获取任何表,然后将它们打印为html。 检查HTML,查看它带回的表。 当你只想要一个时,它可能会抓住几个,所以你需要告诉它如何选出你想要的一个表。 例如,如果您注意到所需的表具有CSS类“ userdata ”,请尝试以下操作:

 puts post_page.parser.xpath("//table[@class='userdata']").to_html 

任何时候你没有返回一个数组,你就搞砸了xpath,所以在程序之前修复它。 一旦你得到你想要的表,然后尝试获取行:

 puts post_page.parser.xpath("//table[@class='userdata']//tr").to_html 

如果有效,那么取下“ to_html ”,你现在有一个Nokogiri节点数组,每个节点都有一个表行。

这就是你如何做到的。

我认为你已经从Firebug复制了这个,firebug给你一个额外的tbody,它可能不在实际的代码中……所以我的建议是删除那个tbody然后再试一次。 如果它仍然不起作用…那么按照韦恩康拉德的过程,这是最好的!