2012-06-05 14 views
5

मुझे लिखने वाले स्क्रैपर के साथ मदद की ज़रूरत है। मैं विश्वविद्यालय रैंकिंग की एक तालिका को खरोंच करने की कोशिश कर रहा हूं, और उनमें से कुछ स्कूल यूरोपीय विश्वविद्यालय हैं जिनके नाम पर विदेशी पात्र हैं (उदा। Ä, ü)। मैं पहले से ही एक ही साइट पर विदेशी विश्वविद्यालयों के साथ एक और साइट पर स्क्रैप कर रहा हूं, और सब कुछ ठीक काम करता है। लेकिन किसी कारण से, वर्तमान स्क्रैपर विदेशी पात्रों के साथ काम नहीं करेगा (और जहां तक ​​विदेशी पात्रों को पार्स कर रहे हैं, दो स्क्रैपर्स बिल्कुल वही हैं)।विदेशी अक्षरों के साथ स्क्रैपिंग साइट के साथ समस्या

यहाँ मैं चीजों को काम करने के & कोशिश करने के लिए कर रहा हूँ है:

# -*- coding: utf-8 -*- 
  • & आयात कर रहा है Django से स्मार्ट यूनिकोड का उपयोग कर: फ़ाइल के पहले लाइन पर

    1. प्रचार एन्कोडिंग django.utils.encoding आयात से फ्रेमवर्क smart_unicode

      school_name = smart_unicode(html_elements[2].text_content(), encoding='utf-8',   
      strings_only=False, errors='strict').encode('utf-8') 
      
    2. स्मार्ट_निकोड फ़ंक्शन के साथ जंजीर होने पर ऊपर देखे गए एन्कोड फ़ंक्शन का उपयोग करें। मैं नहीं सोच सकता कि मैं और क्या गलत कर सकता हूं। इन स्क्रैपर्स से निपटने से पहले, मुझे वास्तव में अलग-अलग एन्कोडिंग के बारे में बहुत कुछ नहीं पता था, इसलिए यह एक आंख खोलने का अनुभव रहा है। मैं इस समस्या को

    मैं समझता हूँ कि कोई एन्कोडिंग में, हर चरित्र है कि दूर नहीं कर सकते हैं निम्नलिखित पढ़ने की कोशिश की है, लेकिन अभी भी एक संख्या असाइन की गई, जिसे हेक्स, बाइनरी इत्यादि में व्यक्त किया जा सकता है। विभिन्न एन्कोडिंग में विभिन्न क्षमताओं की आवश्यकता होती है कि वे कितनी भाषाओं का समर्थन करते हैं (जैसे ASCII केवल समर्थन करता है अंग्रेजी, यूटीएफ -8 ऐसा लगता है जो सब कुछ लगता है। हालांकि, मुझे लगता है कि पात्रों को सही तरीके से मुद्रित करने के लिए मैं आवश्यक सब कुछ कर रहा हूं। मुझे नहीं पता कि मेरी गलती कहां है, और यह मुझे पागल कर रही है। कृपया मदद करें !!

  • +3

    FYI करें, (1) केवल अजगर स्रोत फ़ाइल की एन्कोडिंग सेट, ताकि आप कोड में गैर- ASCII वर्ण एम्बेड कर सकते हैं; यह कुछ भी wrt नहीं करता है। इनपुट आउटपुट। –

    +0

    आह ठीक है, मुझे यह नहीं पता था। मुझे जानकारी देने के लिए धन्यवाद। – user642547

    +0

    'ASCII केवल अंग्रेजी का समर्थन करता है 'ठीक नहीं है। ऐसी अन्य भाषाएं हैं जो ASCII द्वारा "समर्थित" हैं। – dda

    उत्तर

    2

    किसी वेब पेज से जानकारी निकालने पर, आपको अपने चरित्र एन्कोडिंग को निर्धारित करने की आवश्यकता होती है, इसी प्रकार ब्राउज़र कैसे ऐसी चीजें करते हैं (HTTP हेडर का विश्लेषण करना, meta टैग खोजने के लिए HTML को पार्स करना, और संभवतः वास्तविक डेटा के आधार पर अनुमान लगाना, उदाहरण के लिए कुछ एन्कोडिंग में बीओएम की तरह दिखने वाली चीज़ की उपस्थिति)। उम्मीद है कि आप एक लाइब्रेरी दिनचर्या पा सकते हैं जो आपके लिए यह करता है।

    किसी भी मामले में, आपको सभी वेब साइटों को utf-8 एन्कोडेड होने की उम्मीद नहीं करनी चाहिए। आईएसओ -885 9 -1 अभी भी व्यापक रूप से उपयोग में है, और सामान्य पढ़ने में आईएसओ -885 9 -1 जैसे कि यह यूटीएफ -8 परिणाम एक बड़ी गड़बड़ी में था (किसी भी गैर-असीसी पात्रों के लिए)।

    -1

    आप दस्तावेज़ के <head> भाग को देखो और देखते हैं कि क्या वहाँ charset जानकारी के लिए पहली जरूरत है:

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

    (ध्यान दें कि StackOverflow, यह बहुत पेज, किसी भी चारसेट की जानकारी नहीं है ... मैं आश्चर्य है कि कैसे 中文字, जिसे मैंने यहां बताया है कि यह यूटीएफ -8 है, चीनी पिकिस पर प्रदर्शित होगा जो शायद जीबीके के रूप में स्थापित किए जाते हैं, या जापानी pasokon जो अभी भी शिफ्ट-जेआईएस भूमि में दृढ़ता से हैं)।

    तो यदि आपके पास एक वर्णमाला है, तो आप जानते हैं कि क्या उम्मीद करनी है, और तदनुसार इसके साथ सौदा करें। यदि नहीं, तो आपको कुछ शिक्षित अनुमान लगाना होगा - पृष्ठ के सादे पाठ संस्करण में गैर-ASCII वर्ण (> 127) हैं? क्या &#19968; (一) या &#233; (é) जैसी HTML इकाइयां हैं?

    एक बार जब आप पृष्ठ के एन्कोडिंग का आकलन/पता लगा लेते हैं, तो आप उसे यूटीएफ -8 में परिवर्तित कर सकते हैं, और अपने रास्ते पर जा सकते हैं।

    +0

    एचटीएमएल में मेटा जानकारी HTTP हेडर के साथ कुछ लेना देना नहीं है। – schlamar

    +0

    और एसओ में हेडर में एक वर्णसेट सेटिंग है: 'सामग्री-प्रकार: टेक्स्ट/एचटीएमएल; charset = utf-8' – schlamar

    +0

    मैं अब HTML स्रोत को देख रहा हूं और कोई वर्णसेट जानकारी नहीं है ... – dda

    0

    यदि आप requests library का उपयोग कर रहे हैं तो यह स्वचालित रूप से HTTP शीर्षलेखों के आधार पर सामग्री को डीकोड कर देगा। एक पृष्ठ की HTML सामग्री प्राप्त करना आसान है:

    >>> import requests 
    >>> r = requests.get('https://github.com/timeline.json') 
    >>> r.text 
    '[{"repository":{"open_issues":0,"url":"https://github.com/... 
    
    संबंधित मुद्दे