Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 保存网站中的所有图像文件_Ruby_Screen Scraping_Web Crawler_Nokogiri - Fatal编程技术网

Ruby 保存网站中的所有图像文件

Ruby 保存网站中的所有图像文件,ruby,screen-scraping,web-crawler,nokogiri,Ruby,Screen Scraping,Web Crawler,Nokogiri,我正在为自己创建一个小应用程序,运行Ruby脚本并保存博客上的所有图像 在识别图像文件后,我不知道如何保存它们。任何帮助都将不胜感激 require 'rubygems' require 'nokogiri' require 'open-uri' url = '[my blog url]' doc = Nokogiri::HTML(open(url)) doc.css("img").each do |item| #something end 编辑:这是假设您在使用wget的unix系统

我正在为自己创建一个小应用程序,运行Ruby脚本并保存博客上的所有图像

在识别图像文件后,我不知道如何保存它们。任何帮助都将不胜感激

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = '[my blog url]'
doc = Nokogiri::HTML(open(url))

doc.css("img").each do |item|
  #something
end
编辑:这是假设您在使用wget的unix系统上:)
编辑2:更新了从nokogiri获取img src的代码。

假设src属性是一个绝对url,可能类似于:

if item['src'] =~ /([^\/]+)$/
    File.open($1, 'wb') {|f| f.write(open(item['src']).read)}
end

使用代码从这里转换为绝对路径:

提示:有一种简单的方法可以使用刮削器从页面的头部/正文获取图像。最酷的是,您还可以定义要返回的图像类型(jpg、png、gif)

试一试:


希望您喜欢。

这真的与rails有关吗?这不处理相对图像路径。@ZackShapiro这是一个正则表达式,它匹配“一个或多个非正斜杠的字符,只要它们触及字符串末尾”;在本例中,@pguardiario使用它来获取文件名,以便可以使用
$1
保存具有该名称的文件。这是我答案中
File.basename(uri)
部分的一种古怪形式。当我使用它时,会出现一个错误。由于conv错误,输出转换失败,字节0xFF 0xC3 0x98 0xC3
if item['src'] =~ /([^\/]+)$/
    File.open($1, 'wb') {|f| f.write(open(item['src']).read)}
end
URL = '[my blog url]'

require 'nokogiri' # gem install nokogiri
require 'open-uri' # already part of your ruby install

Nokogiri::HTML(open(URL)).xpath("//img/@src").each do |src|
  uri = URI.join( URL, src ).to_s # make absolute uri
  File.open(File.basename(uri),'wb'){ |f| f.write(open(uri).read) }
end