Ruby 使用Nokokiri和Pismo进行数据刮取

Ruby 使用Nokokiri和Pismo进行数据刮取,ruby,ruby-on-rails-4,web-crawler,nokogiri,Ruby,Ruby On Rails 4,Web Crawler,Nokogiri,我正在使用一个小应用程序来保存书签。我使用Nokogiri和Pismo(分别)抓取网页以获取标题标签 Nokogiri不保存日语、汉语、俄语或任何带有不寻常字符的语言,而Pismo则从这些语言中保存这些字符,但速度有点慢,而且它不像Nokogiri那样保存标题信息 有谁能推荐一种更好的gem或更好的保存数据的方法吗 doc = Nokogiri::HTML(open(bookmark_params[:link])) @bookmark = current_user.bookmarks.buil

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

Nokogiri不保存日语、汉语、俄语或任何带有不寻常字符的语言,而Pismo则从这些语言中保存这些字符,但速度有点慢,而且它不像Nokogiri那样保存标题信息

有谁能推荐一种更好的gem或更好的保存数据的方法吗

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采访在日本的外国人

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

NTV采访在日本的外国人日テレ外人街頭インタビュー 英文字幕英語字幕


这就是我想要的实际结果。但是gem有点慢。

根据我的经验,如果Nokogiri、RestClient或其他web抓取gem出现编码问题,它有助于找到文档所使用的编码

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

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

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

    doc = Nokogiri.XML(open-uri(http://example.com), nil, 'Windows-1251')
    
  • 请看这里的Phrogz回答:我认为它正确地描述了正在发生的事情。总之,由于某种原因,将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")
    

    你说Nokogiri不保存“怪异”角色是什么意思?添加一个与此重复的HTML示例。另外,你能为你的问题找到一个更好的标题来说明问题吗?这有助于人们选择要处理的问题。请使用该信息更新您的问题,而不是将其添加为注释。当我们回答时,能够从一个地方,一个问题,寻找我们需要知道的一切,这对我们帮助很大。请确保对其进行格式化,使其易于阅读。非常感谢。
    doc = Nokogiri::HTML(open("https://www.youtube.com/watch?v=QXAwnMxlE2Q"), nil, "UTF-8")