如何遍历具有多个对象的页面

时间:2019-07-09 17:32:56

标签: html ruby loops nokogiri watir

我正在尝试为一个以奇怪的方式列出其内容的市场网站进行抓取。 对于列表中的每个项目,我都必须单击它来查找价格,一旦单击它并在解析数据后返回,则项目列表的顺序可能已更改。

使用Watir来引用每个“链接”的方法没有特定的方法,因此我不了解如何以一种有序的方式成功地成功解析所有商品的价格。

我使用Watir访问项目rb browser.element(:text => 'ItemName').click。如果这只是我想使用Nokogiri解析数据的一项,那就很好。

<div id="market" class="itemList active" style="height: 396px;" data-category="30">
    <div class="item" data-mainkey="4601" data-count="40503" data-grade="0">
        <div class="thumbImg" style="background-image: url(&quot;https://akamai-webcdn.kgstatic.net/TradeMarket/Common/item/4601.png&quot;)"></div>
        <div class="content"><p>Ash Timber</p><p class="gray"></p></div>
        <div class="count">40503</div>
    </div>
    <div class="item" data-mainkey="4602" data-count="266" data-grade="0">
    <div class="thumbImg" style="background-image: url(&quot;https://akamai-webcdn.kgstatic.net/TradeMarket/Common/item/4602.png&quot;)"></div>
    <div class="content"><p>Maple Timber</p><p class="gray"></p></div>
    <div class="count">266</div>
</div>

除了还有几百篇文章以外,列表就是这样。

browser.element(:text => 'Materials').click
sleep 2
browser.element(:text => 'Wood').click
sleep 2
browser.element(:text => 'Ash Timber').click
sleep 2


page = Nokogiri::HTML(browser.html)
page.xpath('/html/body/div/div[1]/main/div[1]/div[2]/div[2]/p[1]').each do |nc|
  @name = (nc).text
  puts @name
end

有没有一种方法可以根据每个项目的“数据主键”对其进行迭代,因为这是我所看到的项目的标识符。

这是当前项目,它可以很好地输出项目名称。

我希望该项目浏览文章列表,输入文章并将其解析为数组并显示结果,但是我不知道如何实现。

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解页面流,但是听起来您需要:

  • 存储所有data_mainkey值
  • 遍历每个主键值-每次都重新定位元素

代码如下:

main_keys = browser.divs(class: 'item').map(&:data_mainkey)
main_keys.each do |key|
  # Depending how the page is written, the div(class: 'content') might not be necessary
  browser.div(data_mainkey: key).div(class: 'content').click

  # Get the price

  # Navigate back to the list page
end