在Ruby中用文本替换img标签的建议?

时间:2012-03-26 22:29:06

标签: ruby

我正在尝试研究如何在数据库中存储驱动器统计信息的html表,但开发人员有点聪明,并开始使用gif来表示通过/失败/健康状况

以下是我所得到的片段:

<tr class="status">
<td class="status"><img border="0" src="/tick_green.gif"></td>
<td class="status">8</td>
<td class="status">Ready</td>
<td class="status"><a href="/cgi-bin/status_drive?cont=0&amp;dylan=0&amp;drive=8"><img border="0" src="/bar10.gif"></a></td>
<td class="status">SEAGATE ST3146807FC</td>
<td class="status">10000 RPM</td>
<td class="status">3HY61AG9</td>
<td class="status">XR12</td>
<td class="status">286749488</td>
<td class="status"> 28.0&#176;C</td>
<td class="status" style="background-color: #00fa00">&#160;
</td>

**

这是我迄今为止用来删除标签的一些红宝石:

table = page.parser.xpath('//table/caption[contains(.,"Drive")]/..')
table.xpath('//table//tr').each do |row|
  row.xpath('td').each do |cell|
    puts   cell.to_html.gsub(/<a[^>]+>/,'').gsub(/<td[^>]+>/,'').gsub(/<\/td[^>]*>/,'').gsub(/<\/a[^>]*>/,'')
    #puts cell.text
  end
end

我现在可以得到半理性输出

<img border="0" src="/tick_green.gif">
15
Ready
<img border="0" src="/bar10.gif">
SEAGATE ST3146807FC
10000 RPM
3HY61ASW
XR12
286749488
 29.0&#176;C
&#160;

但我想用其他位替换其他几个单元格元素 例如,tick_green也可以是'/cross_red.gif'或'/caution.gif',我想用常规文本替换,同样,img bar10.gif,我想用'10'的文本替换 是否最好为我的所有特殊情况提出一大堆价值观?

2 个答案:

答案 0 :(得分:1)

我会做一些'gsub'iing。

E.g:

example = <<-STRING
<img border="0" src="/tick_green.gif">
15
Ready
<img border="0" src="/bar10.gif">
SEAGATE ST3146807FC
10000 RPM
3HY61ASW
XR12
286749488
29.0&#176;C
&#160;
STRING

replace = Hash.new("#unknown")
replace['tick_green.gif'] = "[OK]"
replace['bar10.gif'] = "[10]"

regex = /<img [^>]* src="\/(.*)">/
result = example.gsub(regex) { replace[$1] } 

不知怎的,我想用命名的反向引用代替$ 1,但不知道怎么回事。

http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub

编辑:上面的结果

[OK]
15
Ready
[10]
SEAGATE ST3146807FC
10000 RPM
3HY61ASW
XR12
286749488
 29.0&#176;C
&#160;

答案 1 :(得分:0)

案例陈述会清除一点但是:

row.css('td').each do |td|
    img = td.at('img')
    puts case
        when img && img[:src][/bar(\d+)\.gif/] then $1
        when img && img[:src][/tick_green/] then 'ok'
        else td.text.strip
    end
end