2010-04-03 23 views
23

मैं वेब पेज पर शीर्षक टैग की सामग्री को पकड़ने के लिए नोकोगिरी और ओपन-यूरी का उपयोग कर रहा हूं, लेकिन मुझे उच्चारण वर्णों में परेशानी हो रही है। इनसे निपटने का सबसे अच्छा तरीका क्या है? यहाँ मैं क्या कर रहा है:नोकोगिरी, ओपन-यूरी, और यूनिकोड वर्ण

require 'open-uri' 
require 'nokogiri' 

doc = Nokogiri::HTML(open(link)) 
title = doc.at_css("title") 

इस बिंदु पर, शीर्षक इस तरह दिखता है:

राग \ 303 \ 271

बजाय:

Ragù

मैं कैसे nokogiri उचित चरित्र वापस कर सकते हैं (उदा। इस मामले में)?

http://www.epicurious.com/recipes/food/views/Tagliatelle-with-Duck-Ragu-242037

+0

यह उन लोगों की सहायता करेगा जो हमारी साइट पर यूआरएल प्राप्त कर सकते हैं ताकि हम इसके खिलाफ परीक्षण कर सकें। –

+0

बाद में शीर्षक का निरीक्षण कैसे करते हैं और आप किस रूबी संस्करण का उपयोग कर रहे हैं? 'रैग \ 303 \ 271' _is_' Ragù' UTF-8-एन्कोडेड। –

+0

हाय मैलाडन, मैं रुबी 1.8.6 का उपयोग कर रहा हूं। मैं रुबी इंटरेक्टिव कंसोल से शीर्षक का निरीक्षण कर रहा हूं। आखिरकार, यह एक MySQL डेटाबेस में संग्रहीत किया जाता है। एक बार MySQL में ऐसा लगता है: ù – Moe

उत्तर

10

जब आप कहते हैं कि "इस तरह दिखता है," आप यह मान आईआरबी देख रहे हैं:

यहाँ एक उदाहरण यूआरएल है? यह गैर-ASCII श्रेणी वर्णों से बचने जा रहा है जिसमें सी-स्टाइल बाइट अनुक्रमों से बचने वाले पात्रों का प्रतिनिधित्व करता है।

यदि आप उन्हें डालों के साथ प्रिंट करते हैं, तो आप उन्हें वापस ले लेंगे जैसा कि आप उम्मीद करते हैं, मान लें कि आपका खोल कंसोल एक ही एन्कोडिंग का उपयोग कर स्ट्रिंग के रूप में उपयोग कर रहा है (स्पष्ट रूप से इस मामले में यूटीएफ -8, दो बाइट्स के आधार पर उस चरित्र के लिए)। यदि आप किसी टेक्स्ट फ़ाइल में मान संग्रहीत कर रहे हैं, तो हैंडल पर प्रिंट करने से यूटीएफ -8 अनुक्रमों का भी परिणाम होना चाहिए।

यदि आपको यूटीएफ -8 और अन्य एन्कोडिंग के बीच अनुवाद करने की आवश्यकता है, तो विनिर्देश इस बात पर निर्भर करते हैं कि आप रूबी 1.9 या 1.8.6 में हैं या नहीं।

1.9: http://blog.grayproductions.net/articles/ruby_19s_string 1.8 के लिए, आपको शायद Iconv को देखने की आवश्यकता है।

require 'win32ole' 

WIN32OLE.codepage = WIN32OLE::CP_UTF8 

आप mysql के साथ बातचीत कर रहे हैं,:

इसके अलावा, अगर आप Windows में COM घटकों के साथ बातचीत करने की जरूरत है, तो आप गहरे लाल रंग का बताने के लिए निम्नलिखित की तरह कुछ के साथ सही एन्कोडिंग का उपयोग करना होगा आपको तालिका पर उस संयोजन पर सेट करना होगा जो उस एन्कोडिंग का समर्थन करता है जिसके साथ आप काम कर रहे हैं। आम तौर पर, यूटीएफ -8 को टक्कर सेट करना सबसे अच्छा है, भले ही आपकी कुछ सामग्री अन्य एन्कोडिंग में वापस आ रही हो; आपको बस आवश्यकतानुसार रूपांतरित करने की आवश्यकता होगी।

नोकोगिरी में विभिन्न एन्कोडिंग (शायद इकोव के माध्यम से) से निपटने के लिए कुछ विशेषताएं हैं, लेकिन मैं इसके साथ अभ्यास से थोड़ी दूर हूं, इसलिए मैं किसी और के बारे में स्पष्टीकरण छोड़ दूंगा।

+0

हाय जेसन, सभी मदद के लिए बहुत बहुत धन्यवाद। यह पूरी तरह से काम कर रहा है। मैंने अपना MySQL डीबी एन्कोडिंग यूटीएफ -8 के साथ-साथ मेरी टर्मिनल प्रोफाइल पर सेट किया है। – Moe

+0

@Moe यह समस्या को 'संभालना' हो सकता है, या यह मुखौटा हो सकता है। स्वच्छतापूर्वक यह सुनिश्चित करने के लिए मेरा जवाब देखें कि नोकोगिरी सही यूटीएफ -8 सामग्री प्राप्त कर रहा है। – Phrogz

1

आप वेबसाइट से प्रतिक्रिया स्क्रैप जा रहा है (यहां epicurious.com) UTF-8 में परिवर्तित करने की जरूरत है एन्कोडिंग।

पृष्ठ से एचटीएमएल सामग्री के अनुसार स्क्रैप किया जा रहा है, अब इसके लिए "आईएसओ -885 9 -1"।इसलिए, जब आप कुछ इस तरह करने की जरूरत है:

require 'iconv' 
doc = Nokogiri::HTML(Iconv.conv('utf-8//IGNORE', 'ISO-8859-1', open(link).read)) 

इसके बारे में यहाँ और अधिक पढ़ें: http://www.quarkruby.com/2009/9/22/rails-utf-8-and-html-screen-scraping

+0

प्रदान किए गए नमूने से, यह स्पष्ट है कि उनकी सामग्री पहले ही यूटीएफ -8 में है। – JasonTrue

+0

नहीं, यह नहीं है। अन्यथा वह केवल प्राप्त होगा। वेबपृष्ठ यूटीएफ -8 एन्कोडेड नहीं है – Nakul

+0

\ 303 \ 271 सी-एस्केप यूटीएफ -8 बाइट वैल्यू हैं, इस तरह वे मूल्यांकन किए गए स्ट्रिंग को देखते समय आईआरबी में दिखाई देते हैं; यह सी 3 बी 9 के लिए ऑक्टल है, जो यूटीएफ -8 अनुक्रम है। यदि यह आईएसओ -885 9 -1 था, तो वह एफ 9, या \ 371 के लिए ऑक्टल प्राप्त कर लेता। – JasonTrue

6

तो की तरह, Nokogiri की एन्कोडिंग विकल्प सेट करने का प्रयास करें:

require 'open-uri' 
require 'nokogiri' 
doc = Nokogiri::HTML(open(link)) 
doc.encoding = 'utf-8' 
title = doc.at_css("title") 
56

सारांश: यूटीएफ -8 को ओपन-यूरी के माध्यम से नोकोगिरी को खिलाते समय, open(...).read का उपयोग करें और परिणामी स्ट्रिंग को नोकोगिरी में पास करें।

विश्लेषण: अगर मैं कर्ल का उपयोग कर पृष्ठ लाने, हेडर ठीक से Content-Type: text/html; charset=UTF-8 और फ़ाइल की सामग्री को दिखाने वैध UTF-8 शामिल हो, उदा "Genealogía de Jesucristo"

# encoding: UTF-8 
require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI')) 
doc.encoding = 'utf-8' 
h52 = doc.css('h5')[1] 
puts h52.text, h52.text.encoding 
#=> Genealogà a de Jesucristo 
#=> UTF-8 

हम देख सकते हैं कि इस खुले uri की गलती नहीं है:

html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI') 
gene = html.read[/Gene\S+/] 
puts gene, gene.encoding 
#=> Genealogía 
#=> UTF-8 

यह वह जगह है लेकिन फिर भी रूबी फ़ाइल करें और डॉक एन्कोडिंग की स्थापना पर एक जादू टिप्पणी के साथ, यह कोई अच्छी बात है ओपन-यूरी से निपटने पर एक नोकोगिरी मुद्दा, ऐसा लगता है। यह Nokogiri करने के लिए एक कच्चे स्ट्रिंग के रूप में एचटीएमएल पास करके चारों ओर काम किया जा सकता है:

# encoding: UTF-8 
require 'nokogiri' 
require 'open-uri' 

html = open('http://www.biblegateway.com/passage/?search=Mateo1-2&version=NVI') 
doc = Nokogiri::HTML(html.read) 
doc.encoding = 'utf-8' 
h52 = doc.css('h5')[1].text 
puts h52, h52.encoding, h52 == "Genealogía de Jesucristo" 
#=> Genealogía de Jesucristo 
#=> UTF-8 
#=> true 
+0

धन्यवाद आपने अभी मेरी मदद की है :) –

+0

धन्यवाद इस उत्तर के लिए बहुत कुछ! –

+1

वाह, मैंने कभी यह नहीं सोचा होगा कि '.read' के अतिरिक्त इसे ठीक कर देगा। धन्यवाद! – g33kz0r

36

मैं एक ही समस्या और iconv दृष्टिकोण से काम नहीं कर रहा था हो रही थी। Nokogiri::HTMLNokogiri::HTML.parse(thing, url, encoding, options) पर उपनाम है।

तो, आप सिर्फ क्या करने की जरूरत:

doc = Nokogiri::HTML(open(link).read, nil, 'utf-8')

और यह utf-8 के लिए ठीक से पेज एन्कोडिंग बदल देंगे। आपको Rag\303\271 के बजाय Ragù दिखाई देगा।

0

युक्ति: आप यूआरआई से बहुत ही सरल तरीके से पेज शीर्षक के रूप में मेटाडेटा प्राप्त करने के लिए स्क्रैपफायर मणि का भी उपयोग कर सकते हैं। डेटा यूटीएफ -8 में एन्कोड किया गया है।

इसे देखें: https://github.com/tiagopog/scrapifier

आशा है कि यह आप के लिए उपयोगी है।

संबंधित मुद्दे