Ruby Nokogiri 采集的文章内容包括图片,如何保存内容,替换换本地的图片文件路径啊?

xufeng · 2012年03月18日 · 最后由 alucardpj 回复于 2016年06月13日 · 5296 次阅读
# encoding: utf-8
require 'rubygems'

require 'nokogiri'

require 'open-uri'

require 'date'

page = Nokogiri::HTML(open('http://www.36kr.com/p/91876.html'))

puts page.css('#post p')

puts page.css('#post p img')

图片远程路径src和文章内容,我都可以得到。如何用本地的图片路径替换到采集的图片的远程路径?




新人求帮助,谢谢了。

page.css('#post p').each {|p| puts p.text } page.css('#post p img').each {|img| puts img.attr('src') }

你是说要这样的结果么?

同学,问问题要问的清楚一点。我猜你的需求是不是: 抓取网页,分析网页里的图片资源地址,将这些图片资源都下载下来,然后保存该网页,并且将该网页中所有图片资源的 url 改为本地图片目录的相对地址。right?

#3 楼 @alucardpj 我觉得@xufeng 是想把网页部分内容拿到,也包含下载图片到本地。

这个需求适合直接用 wget

#3 楼 @alucardpj 是的 如何替换内容?

图片远程路径 src 和文章内容,我都可以得到。如何用本地的图片路径替换到采集的图片的远程路径?

高手请别不屑于这类问题,帮人一忙,胜造七级浮屠

用 nokogiri 的话做这样的替换很简单啊,可以在 nokogiri 获得的 page 文档上应用 xpath 或者用 at_css 等得到 img 标签节点 node,然后 node['src']=图片本地相对路径。最后将修改过的 page 文档用 to_s 方法保存到文件里去

#9 楼 @alucardpj 把这些图片存储到数据库的话如何操作?

#4 楼 @ruby_sky 这个问题有解决么,存储到本地的图片和数据库如何进行结合?

#10 楼 @runup 一定要把图片存到数据库里去吗?一般来说图片都是文件形式保存,数据库仅记录图片文件名路径这些元信息,读取的时候拼接文件路径访问图片文件。存到数据库里一方面数据量比较大,也不存在图片内查询的需求,意义不大。 如果非要存到数据库中,可以将数据库字段设为 blob 形式,以二进制数据的方式保存。

#12 楼 @alucardpj 这两天用 carrierwave,我看这个 gem 的实现形式就是你这样说的,突然茅塞顿开。我一直以为图片是要保存在数据库中。我目前有个场景需要实现,就是使用 nokogiri 抓取网站的图片,然后在自己的系统中呈现这个图片。目前遇到的问题如下: 1.nokogiri 目前我只找到图片相对路径的地址,可以对其保存,比如 doc.css("xxx")[0]["src"],但是在 nokogiri 目前没有找到保存图片到本地的方法。 2.mechanize 中存在保存图片的方法,但是如何实现数据库保存的网站图片相对路径和本地图片路径的一一对应关系? 非常感谢指点。

#13 楼 @runup nokogiri 只是对 html/xml 文档做 dom 解析使用,它本身不提供下载图片的功能,如果需要下载图片,可以结合其他 http client 组件做文件下载保存,比如 httparty 之类的

doc.css("xxx")[0]["src"].each do |src|
    File.open("a.jpg") do |file|
      file.write Httparty.get(src)
    end
end

为了保证图片路径的可移植性(比如上 cdn 以后需要切换图片地址),数据库里面一般只保存图片的文件名或者相对路径,绝对路径的 base_path 一般另外写配置项,在实际获取的时候拼接两部分得到最终的图片地址。比如 carrierwave 就是在 uploader 中配置相对路径,initialize 里面配置绝对地址,再和数据库中保存的图片文件名拼接得到最终路径

需要 登录 后方可回复, 如果你还没有账号请 注册新账号