Watir刮擦顺序元素:如此简单,但没有

时间:2018-07-12 21:56:28

标签: ruby watir

这是如此简单... 我想用watir(宝石红宝石:)来刮掉一些这样的网页

<div class="Time">time1</div> 
<div class="Locus">locus1</div>
<div class="Locus">locus2</div>
<div class="Time">time2</div>
<div class="Locus">locus3</div>
<div class="Time">time3</div>
<div class="Locus">locus4</div>
<div class="Locus">locus5</div>
<div class="Locus">locus6</div>
<div class="Time">time4</div>
etc..

结果应该是这样的数组:

time1 locus1
time1 locus2
time2 locus3
time3 locus4
time3 locus5
time3 locus6
time4 xxx

所有div处于同一级别(不固定)。 无法使用watir方法找到解决方案... 感谢您的帮助

1 个答案:

答案 0 :(得分:2)

对于每个轨迹元素,您可以通过#preceding_sibling方法检索前面的Time元素:

result = browser.divs(class: 'Locus').map do |div|
  time = div.preceding_sibling(class: 'Time').text
  locus = div.text
  "#{time} #{locus}"
end
p result
#=> ["time1 locus1", "time1 locus2", "time2 locus3", "time3 locus4", "time3 locus5", "time3 locus6"]

请注意,如果列表很长,您可能希望通过Watir检索HTML,然后在Nokogiri中进行解析。这样可以节省大量执行时间,但会以可读性为代价。

doc = Nokogiri::HTML.parse(browser.html) # where `browser` is the usual Watir::Browser
result = doc.css('.Locus').map do |div|
  time = div.at('./preceding-sibling::div[@class="Time"]').text
  locus = div.text
  "#{time} #{locus}"
end
p result
#=> ["time1 locus1", "time1 locus2", "time1 locus3", "time1 locus4", "time1 locus5", "time1 locus6"]