使用Nokogiri和Pismo进行数据搜索

时间:2014-12-29 20:40:21

标签: ruby ruby-on-rails-4 web-crawler nokogiri

我正在一个小应用程序中保存书签。我使用Nokogiri和Pismo(单独)来抓取网页以获取标题标记。

Nokogiri不保存日语,中文,俄语或任何具有不寻常字符的语言,另一方面Pismo从这些语言中保存这些字符,但它有点慢,并且不保存标题信息以及Nokogiri。

任何人都可以推荐更好的宝石或更好的方法来保存这些数据吗?

doc = Nokogiri::HTML(open(bookmark_params[:link]))

@bookmark = current_user.bookmarks.build(bookmark_params)
@bookmark.title = doc.title.to_s

这就是我所说的“奇怪的人物”

如果我在下面的链接中使用nokogiri来扫描页面标题

youtube.com/watch?v=QXAwnMxlE2Q
 这就是我得到的。

NTV在日本接受外国人采访æ¥ããåå¤äººè¡ããããããããããããããããã¥Ñ¥Eng ......

但是使用pismo gem这就是我得到的。

NTV采访日本外国人日テレ外人街头インタビュー英文字幕英语字幕

这是我想要的实际结果。但宝石有点慢。

2 个答案:

答案 0 :(得分:1)

根据我的经验,在编码Nokogiri或RestClient或其他网页抓取宝石的问题的情况下,它有助于找到它使用的文档编码。

此信息通常位于元标记处:

<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">

这并不总是正确的,因为实际编码可能与标签建议的不同,但如果您可以找到元标记,则值得一试。或者,您可以尝试一些不同的编码。

  1. 然后得到回复:

    doc = Nokogiri::HTML(open-uri(http://example.com))
    

    并尝试:

    doc.force_encoding('Windows-1251').encode('UTF-8')
    
  2. 或者,明确设置Nokogiri的编码可能会有所帮助:

    doc = Nokogiri.XML(open-uri(http://example.com), nil, 'Windows-1251')
    

答案 1 :(得分:0)

请参阅Phrogz的回答:Nokogiri, open-uri, and Unicode Characters我认为正确描述了您的情况。总之,由于某种原因,将open-url创建的IO对象传递给nokogiri存在问题。而是将文档作为字符串阅读并将其提供给Nokogiri,即:

require 'nokogiri'
require 'open-uri'

open("https://www.youtube.com/watch?v=QXAwnMxlE2Q") {|f|
  p f.content_type     # "text/html"
  p f.charset          # "UTF-8"
  p f.content_encoding # []
}

doc = Nokogiri::HTML(open("https://www.youtube.com/watch?v=QXAwnMxlE2Q"))
puts doc.title.to_s # =>  NTV interview foreigners in Japan æ¥ãã¬å¤äººè¡é ­ã¤ã³ã¿ãã¥ã¼ English Subtitles è±èªå­å¹ - YouTube


doc = Nokogiri::HTML(open("https://www.youtube.com/watch?v=QXAwnMxlE2Q").read)
puts doc.title.to_s # => NTV interview foreigners in Japan 日テレ外人街頭インタビュー English Subtitles 英語字幕 - YouTube

如果你知道内容总是UTF-8,你当然可以这样做:

doc = Nokogiri::HTML(open("https://www.youtube.com/watch?v=QXAwnMxlE2Q"), nil, "UTF-8")