【问题标题】:HTML scraping with hpricot using Ruby 1.8.7 vs 1.9.2使用 Ruby 1.8.7 与 1.9.2 使用 hpricot 进行 HTML 抓取
【发布时间】:2011-09-29 13:50:25
【问题描述】:

来自test.html的相关sn-p:

<div id="seat_31F_vacant" class="seatVacant" onclick="UpdateHost(this);Common.DoPostBack('lbtPostBack','31F');" onmouseover="Seat_onMouseOver(this)" onmouseout="Seat_onMouseOut(this)">F</div>

现在考虑这个 ruby​​ 代码:

doc = Hpricot(test.html)
  
doc.search("//div[@class='seats']").each do |seat|          
    @vacant_seat += seat.to_s.scan(/id="seat_(.*)_vacant/)
end

@log.info @vacant_seat.to_s

当记录@vacant_seat.to_s 时,这就是我的最终结果:

[["31F"], ["31E"], ["31D"], ["31C"]] (使用1.9.2)

31F31E31D31C(使用1.8.7

这意味着如果我这样做 @vacant_seat[0].to_s 我会得到:

["31F"] (1.9.2) 和 31F (1.8.7) p>

我想以 31F 结束(就像我对 1.8.7 所做的那样)

有什么想法吗?有没有一种通用的方法可以在两个 Ruby 版本中使用?我需要提取位于 ID 属性中下划线字符 (_) 之间的字符串(例如 31F)。如果有更好的方法可以做到这一点,我将不胜感激。

【问题讨论】:

  • 这与黄瓜或watir有什么关系?
  • 如果您提供相关的HTML,将更容易重现问题。
  • 感谢您的 cmets。我想稍后使用它来自动化一些测试(使用 watir-webdriver 并在测试运行期间单击收集的元素),并认为这可能是人们这样做的常见问题(抓取 html)。我也可以看到它更像是一个 Ruby 的东西,所以如果你认为这些标签有误导性,我可以删除它们。

标签: ruby


【解决方案1】:

Ruby 1.9.2 将数组更改为 _s。它用于连接所有元素并像31F31E31D31C 一样打印它们。

现在它添加了花哨的格式,使其看起来像一个数组,因此您可以看到数组上的括号,以及其中的字符串元素的引号,因此您会得到[["31F"], ["31E"], ["31D"], ["31C"]]

看起来@vacant_seat 是一个数组数组,所以这就是@vacant_seat[0].to_s 给你["31F"] 的原因。

如果您只需要包含元素的数组,那么它在两者中都是相同的数组,只是打印方式不同。

现在,您可以使用 join 调用 1.8.7 中的 to_s。 @vacant_seat.join #=&gt; 31F31E31D31C@vacant_seat[0].join #=&gt; 31F,将为您提供所需的内容。

【讨论】:

  • 感谢您的回答。相同的代码怎么可能是 1.9.2 的数组?我认为两个版本的数组处理方式相同。不过,您似乎对格式化的事情有所了解.. Array 的 to_s 方法将使用括号和引号等将它们打印出来...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多