4

我正在从论坛中提取数据。我的脚本基于工作正常。现在我需要从单个帖子中提取日期和时间(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 导航到需要抓取的页面后,然后使用 Nokogiri 方法对其进行抓取。

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

4

2 回答 2

28

拉德克。我将向你展示如何钓鱼。

当你打电话时Mechanize::Page::parser,它会给你 Nokogiri 文件。所以你的 " xpath" 和 " at_xpath" 调用正在调用 Nokogiri。问题出在您的 xpath 中。一般来说,从你可以开始工作的最通用的 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 节点数组,每个节点都是表格行。

这就是你的做法。

于 2010-01-22T03:29:20.310 回答
6

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

于 2010-12-29T20:39:40.677 回答