使用Ruby 1.8.7与1.9.2使用hpricot进行HTML抓取

时间:2011-09-29 13:50:25

标签: ruby

test.html的相关代码段:

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

现在考虑一下这个红宝石代码:

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

我想以31F(与1.8.7一样)结束

有什么想法吗?有没有一种通用的方法可以在两个Ruby版本中工作?我需要提取位于ID属性中下划线字符(_)之间的字符串(例如31F)。如果有更好的方法,我会很高兴听到它。

1 个答案:

答案 0 :(得分: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 #=> 31F31E31D31C@vacant_seat[0].join #=> 31F会为您提供所需内容。