【问题标题】:Is it possible to web scrape a web-site if the style is set to style="display:none"如果样式设置为 style="display:none" 是否可以对网站进行网页抓取
【发布时间】:2018-02-08 20:17:37
【问题描述】:

这就是 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 条。我已经仔细检查了链接,我已经在网络上抓取了其他网站,所以我有点知道如何做到这一点..

【问题讨论】:

  • 我不明白你的问题。您所说的“它给了我在页面上找不到的文本”是什么意思?你想检索什么,而你得到了什么?你能分享你的抓取代码吗?
  • 添加了代码和描述。感谢您抽出宝贵时间回复。
  • 您可能希望定位div 元素并排除任何具有hide 类的元素。
  • 我尝试直接定位包含我想要的文本数据的 div,但这也不起作用。退还我在网页上找不到的产品。
  • 它也可能会根据您的 cookie 或位置等更改产品。在我的抓取结果与我在本地/在我的浏览器中看到的结果大不相同之前,我不得不抓取网站,结果证明是因为我正在测试的服务器在乔治亚州出现故障,而我正在运行在华盛顿这里。我还抓取了一些网站,当浏览器检查我的结果时,我在隐身窗口/我的刮刀与我的普通窗口中发现了不同的结果......很难说不知道它是什么网站等等

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


【解决方案1】:

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】:

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

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

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

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

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

    【讨论】:

    • Watir 被设计为不需要使用 XPath。有一个“可见”定位器与您的建议相匹配:@browser.div(visible: true),但我不确定它是否一定能满足这里的需求。
    • 是的,我比 Watir API 更了解 CSS 和 XPath。 visible: true 似乎是更好的方法。
    【解决方案3】:

    向 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;}

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 2012-12-16
      • 2016-02-24
      • 2021-03-29
      • 2017-04-05
      • 2015-06-24
      • 1970-01-01
      • 2019-09-08
      相关资源
      最近更新 更多