从外部网页到db中存储的HTML

时间:2017-11-09 09:21:03

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

(Rails 5 + PostGreSQL)

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

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

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

有人对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

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

如果没有,您可以使用Net:HTTP将页面内容转换为局部变量,然后您可以使用字符串操作来查找所需的内容并存储它。不幸的是,我认为没有任何直接的方法来专门用这种方法选择那个元素。

答案 1 :(得分:1)

您可以轻松打开网址,解析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

这将创造一个没有描述的新运动员,但必须通过它的身份来获得它。之后您可以创建一个任务,在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