Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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:如何获得一篇文章';s主图像或链接预览是如何工作的?_Ruby_Parsing - Fatal编程技术网

Ruby:如何获得一篇文章';s主图像或链接预览是如何工作的?

Ruby:如何获得一篇文章';s主图像或链接预览是如何工作的?,ruby,parsing,Ruby,Parsing,我试图了解链接预览是如何工作的(例如,在Facebook或Reddit等网站上,在发布链接时预览文章的图像及其标题):如何在不知道其确切图像url的情况下获取文章的“主”图像 例如,在这个我的链接预览应该向我显示这个(主)图像,而不是例如(这是一个图像进一步向下) 我是一个ruby新手,但我能够用Nokogiri获得所有图像,并用这段代码打开Uri(但是问题仍然存在:我如何只获得主图像?) 这是您的代码的一个稍加修改的版本。它为提供的链接工作良好,你将不得不适应它为其他网站 它使用w=后跟大于3

我试图了解链接预览是如何工作的(例如,在Facebook或Reddit等网站上,在发布链接时预览文章的图像及其标题):如何在不知道其确切图像url的情况下获取文章的“主”图像

例如,在这个我的链接预览应该向我显示这个(主)图像,而不是例如(这是一个图像进一步向下)

我是一个ruby新手,但我能够用Nokogiri获得所有图像,并用这段代码打开Uri(但是问题仍然存在:我如何只获得主图像?)


这是您的代码的一个稍加修改的版本。它为提供的链接工作良好,你将不得不适应它为其他网站

它使用
w=
后跟大于300的数字来解析图像URL的代码

它下载第一个找到的图像,可能具有更高的分辨率(
所需的\u width=800

对于给定的示例:

Found 2330.jpg !

试试这个,你不能写一个程序来理解你对“主图像”的意思。您是否总是访问同一页面(在您的示例中为theguardian)?然后您必须检查页面源代码(希望不会太快更改),并找到一个定义css类/选择器。@Felix:我想访问不同的页面,所以我想这是一个相当困难的任务。我知道有很多优秀的ruby宝石,例如,它们工作得很好,但我想了解它们是如何做到的(例如,它们是否只解析第一个大于宽度/高度阈值的图像等?)
URL = 'https://www.theguardian.com/technology/2016/dec/12/facebook-2016-problems-fake-news-censorship'.freeze

require 'open-uri'
require 'nokogiri'

minimum_width = 300
desired_width = 800
width_regex   = /(w=)(\d+)/

Nokogiri::HTML(open(URL)).xpath('//img/@src').find do |src|
  basename = File.basename(src)

  next unless basename =~ width_regex &&
    Regexp.last_match(2).to_i >= minimum_width

  without_parameters = basename.split('?').first
  puts "Found #{without_parameters} !"
  uri = URI.join(URL, src.to_s.sub(width_regex, '\1' + desired_width.to_s))

  File.open(without_parameters, 'wb') do |f|
    f.write(open(uri).read)
  end
end
Found 2330.jpg !