我正在一个小应用程序中保存书签。我使用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
这就是我得到的。
但是使用pismo gem这就是我得到的。
NTV采访日本外国人日テレ外人街头インタビュー英文字幕英语字幕这是我想要的实际结果。但宝石有点慢。
答案 0 :(得分:1)
根据我的经验,在编码Nokogiri或RestClient或其他网页抓取宝石的问题的情况下,它有助于找到它使用的文档编码。
此信息通常位于元标记处:
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
这并不总是正确的,因为实际编码可能与标签建议的不同,但如果您可以找到元标记,则值得一试。或者,您可以尝试一些不同的编码。
然后得到回复:
doc = Nokogiri::HTML(open-uri(http://example.com))
并尝试:
doc.force_encoding('Windows-1251').encode('UTF-8')
或者,明确设置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")