【问题标题】:extract single string from HTML using Ruby/Mechanize (and Nokogiri)使用 Ruby/Mechanize(和 Nokogiri)从 HTML 中提取单个字符串
【发布时间】:2011-01-08 01:15:52
【问题描述】:

我正在从论坛中提取数据。我的脚本based on 工作正常。现在我需要从单个帖子中提取日期和时间(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 的文档。 The Mechanize documentation在页面底部说:

使用 Mechanize 导航到需要抓取的页面后,然后使用 Nokogiri 方法对其进行抓取。

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

【问题讨论】:

    标签: ruby parsing nokogiri information-extraction


    【解决方案1】:

    拉德克。我要教你怎么钓鱼。

    当您致电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 节点数组,每个节点都是表格行。

    你就是这样做的。

    【讨论】:

    • PS:这是一个通用教程,展示了如何找出正确的 xpath:您不会从完全指定的 xpath 开始,因为如果它什么都不返回,您就不知道出了什么问题。从一般的东西开始,它保证会返回一些东西,然后继续使它更具体,直到你得到你想要的东西。通过分步执行,当它不起作用时,您知道这是您添加到 xpath 的最后一件事。
    • @Wayne Conrad:嗨,Wayne,感谢您提供的精彩教程。我会尝试您所说的,但我认为由于我只想要元素的第一个实例,因此使用 absolute 会简单快捷路径。它会给我数组中的第一项。
    • 所以即使你想知道这个问题被浏览了多少次,你也会遵循所有这些步骤?
    • 是的,我总是反复计算我的 xpath。擅长 xpath 的人可能第一次就能搞定它。那个人不是我。决定你得到一件事还是多件事的不是 xpath。是你叫“xpath”还是“at_xpath”。如果你调用“xpath”,你总会得到一件事;如果多个元素匹配,你只会得到第一个。如果你调用“at_​​xpath”,你总是会得到一个数组,即使你只匹配了一个东西。
    • 哇,这是我一直在寻找的东西。 'xpath' 和 'at_xpath' 之间的区别。太棒了!谢谢你。你是怎么知道的?
    【解决方案2】:

    我认为您已从 Firebug 复制了此内容,firebug 为您提供了一个额外的 tbody,而实际代码中可能没有它......所以我的建议是删除该 tbody 并重试。 如果还是不行……那就按照 Wayne Conrad 的流程做最好!

    【讨论】:

    • 浏览器内部的源代码总是值得怀疑的,因为浏览器可以并且将会对不良 HTML 进行大量修复,或者只是将其调整为他们想要的格式。<tbody>标签就是一个很好的例子。我将浏览器的源视图用作“有点像这样”的视图,但是当我尝试解析时,直接从主机检索实际的 HTML 并在编辑器中查看它是否看起来毫无意义。使用 IRB 打开并戳读已解析的文档就足够了,但有时需要打开编辑器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2012-02-03
    • 2011-11-29
    相关资源
    最近更新 更多