如果样式设置为style =“display:none”,是否可以通过Web抓取网站

时间:2017-08-31 01:26:06

标签: html css ruby-on-rails ruby watir

这就是CSS的样子

<ul class="offers general">

    <li class="offer ">

        <div id="offer-detail-384" class="hide" style="display:none">

            <div> Text I want to scrape is here </div>

我已成功网络抓取其他网站,但有了这个,它给我回复,我在页面上找不到任何地方。这是一个包含产品列表的网站,我正在收回一些我在网站上找不到的产品清单。这真奇怪......

代码是

@browser = Watir::Browser.new:phantomjs
@browser.goto "https://Groceries.com/offers"

@products = @browser.lis(class: "offer")

@products.each do |x|
    Groceries.create(title: x.divs[13].text, value: 
    x.divs[14].text)
end

因此,当我尝试检索数据时,我会得到像Nutrigrain酒吧这样的项目,什么不是,但当我只是看看我正在抓取的网站时,在页面的任何地方都没有找到Nutrigrain栏。我已经仔细检查了链接,我已经在网上抓了其他网站,所以我有点想法怎么做..

3 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,请尝试使用CSS选择器专门排除hide类:

@browser.div(css: ':not(.hide)')

我不确定CSS选择器支持在webdriver中有多完整。如果这不起作用,这里的a SO question可能还有其他方法可以做同样的事情。

修改:这是另一个选项,旨在选择不包含隐藏li元素的div元素:

@browser.element( :xpath, '//li[not(div/@class="hide")]' )

答案 1 :(得分:0)

Element#text应该只返回页面上显示的内容,因此您不应该获得实际上看不到的结果。当提供的代码不真实时,很难复制。也许你可以尝试这样的事情:

@products = browser.div(id: /offer-detail-\d+/, visible: true).each do |x| 
    divs = x.divs      # only one wire call
    Groceries.create(title: divs[13].text, value: divs[14].text)
end

答案 2 :(得分:-1)

向div添加一个类可以做到这一点

HTML `

    <li class="offer ">

        <div id="offer-detail-384" class="hide" style="display:none">

            <div class="scrape"> Text I want to scrape is here </div>`

CSS

.scrape {display: block!important;}