我正从论坛中提取数据.我的脚本基于工作正常.现在我需要从单个帖子中提取日期和时间(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然后再试一次.如果它仍然不起作用...那么按照韦恩康拉德的过程,这是最好的!