# 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?
用 nokogiri 的话做这样的替换很简单啊,可以在 nokogiri 获得的 page 文档上应用 xpath 或者用 at_css 等得到 img 标签节点 node,然后 node['src']=图片本地相对路径。最后将修改过的 page 文档用 to_s 方法保存到文件里去
#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 里面配置绝对地址,再和数据库中保存的图片文件名拼接得到最终路径