什么是跟踪元素出现的最佳方法,并使用Nokogiri在Ruby中设置相应的数组

时间:2012-08-10 07:30:01

标签: ruby web-scraping nokogiri

我正在尝试从包含.value.rating-ineligible类混合的网站中抓取数据。

我希望在单个数组中跟踪.value.rating-ineligible,以检查.value是否可用:

page.css('td.title .value').text.strip
page.css('.rating-ineligible').text.strip

我想要一个名为FLAG[]的数组,当"A"存在时元素设置为.value"NA"存在.rating-ineligible 输出应该类似于:

FLAG["A","A","A","NA","A","NA","A","A"]

是否存在使FLAG数组有效的黑客攻击?


示例输入:

<td class=title>

<span class="rating-rating">
<span class="value">8.7</span>
</span>

<div class="rating-ineligible">
<a href="somelink">NYR</a>
</div>

<span class="rating-rating">
<span class="value">5.2</span>
</span>

<span class="rating-rating">
<span class="value">6.1</span>
</span>

<span class="rating-rating">
<span class="value">7.9</span>
</span>

<div class="rating-ineligible">
<a href="somelink">NYR</a>
</div>

<span class="rating-rating">
<span class="value">-</span>
</span>

<span class="rating-rating">
<span class="value">4.2</span>
</span>

</td>

如果您看到上面的样本输入,则存在三种类型的值,

One is rating   :   *.*
Second is       :   NYR
Third one is    :   - (Hyphen) 

我希望将它们捕获在一个数组中,

如果 x.x

格式中存在有效评级,则应将值设置为“A”

如果输入中存在的值为 NYR ,则该值应设置为“NA”

如果输入中存在连字符 - ,则

“ - ”

期望输出:

标志[“A”,“NA”,“A”,“A”,“A”,“NA”,“ - ”,“A”]

不是设置标志而是通过将值捕获到下面的数组中来消除它,

r = page.css('td.title span.value').text.strip
noe=["NOE"]
ra=r.scan(/./)
ra.map!{|x| x=='-'?noe:x}.flatten!
rat=ra.join("")
rati=rat.scan(/.../)    

数组rati []的输出如下所示,

rati [“8.7”​​,“5.2”,“6.1”,“7.9”,“NOE”,“4.2”]

但这里的问题是, 给定输入中总共有8个值, 其中5个值的格式为x.x. 一个值的格式为' - ',在数组中捕获为NOE 但我无法在该阵列中捕获NYR。

现在所需的输出输出应如下所示, rati [“8.7”​​,“NYR”,“5.2”,“6.1”,“7.9”,“NYR”,“NOE”,“4.2”] 但我不知道确切的方法,如何将NYR值捕获到阵列中。

任何人都可以使用正确的代码来执行此操作吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

doc = Nokogiri::HTML(DATA.read)
result = doc.search("//td/*[starts-with(@class, 'rating-')]").map do |node|

  case node.elements.first.text
  when /\d+\.\d+/
    'A'
  when 'NYR'
    'NA'
  when '-'
    '-'
  end

end

pp result # ["A", "NA", "A", "A", "A", "NA", "-", "A"]