【问题标题】:From external Web page to HTML stored in db从外部网页到存储在 db 中的 HTML
【发布时间】:2017-11-09 09:21:03
【问题描述】:

我需要阅读网站的内容,并保存该页面一部分的 HTML。

例如,假设我只想在此页面上获取运动员的描述:https://www.olympic.org/usain-boltsection.text-content 元素。

如何在 Rails 中将该 HTML 存储在我的数据库中,以便以后通过 API 提供它?

有人知道这个吗?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql web-scraping ruby-on-rails-5


    【解决方案1】:

    您可以通过打开 url、解析 html 并访问您指向的元素轻松获取描述,例如:

    require 'nokogiri'
    require 'open-uri'
    
    url = 'https://www.olympic.org/usain-bolt'
    doc = Nokogiri.HTML(open(url))
    puts doc.css('section.text-content').text
    

    既然你已经有了数据,那么你需要一个模型来存储,你可以创建一个新的,就像名为 Athlete 的例子一样,使用 rails generate 命令并迁移,就像

    $ rails g model Athlete description:text
    $ rails db:migrate
    

    描述是一个文本数据类型属性,它允许你存储大文本,作为描述。

    然后你需要插入它,或者更新它。您可以创建一个新记录,然后对其进行更新。在 Rails 控制台中,只需:

    Athlete.create
    

    这将创建一个没有描述的新运动员,但必须通过其 id 获取它。之后你就可以创建一个任务了,在lib/tasks文件夹下,你可以创建一个.rake扩展名的文件并添加你的代码,使用创建任务的方式,比如:

    require 'nokogiri'
    require 'open-uri'
    
    namespace :feed do
      desc 'Gets the athlete description and insert it in database.'
      task athlete_description: :environment do
        url = 'https://www.olympic.org/usain-bolt'
        doc = Nokogiri.HTML(open(url))
        description = doc.css('section.text-content').text
        Athlete.find(1).update description: description
      end
    end
    

    你有库,获取数据,并使用 ActiveRecord 更新记录,你可以轻松运行:

    rails feed:athlete_description
    # or
    rake feed:athlete_description
    

    【讨论】:

      【解决方案2】:

      Nokogiri 可以通过CSS selectors 完成您需要的操作。

      如果没有,您可以使用Net:HTTP 将页面内容放入一个局部变量中,然后您可以使用字符串操作来找到您想要的部分并存储它。不幸的是,我认为没有任何直接的方法可以专门使用此方法选择该元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        相关资源
        最近更新 更多