2013-11-25 9 views
16

मैं एक पायथन प्रोग्राम चला रहा हूं जो यूटीएफ -8-एन्कोडेड वेब पेज लाता है, और मैं सुंदर सूप का उपयोग करके HTML से कुछ पाठ निकालता हूं।सुंदर सूप के साथ यूनिकोड तारों के लिए यूटीएफ -8 एन्कोडेड HTML को सही तरीके से कैसे पार्स करें?

हालांकि, जब मैं इस पाठ को किसी फ़ाइल में लिखता हूं (या इसे कंसोल पर प्रिंट करता हूं), तो यह एक अप्रत्याशित एन्कोडिंग में लिखा जाता है।

नमूना कार्यक्रम:

import urllib2 
from BeautifulSoup import BeautifulSoup 

# Fetch URL 
url = 'http://www.voxnow.de/' 
request = urllib2.Request(url) 
request.add_header('Accept-Encoding', 'utf-8') 

# Response has UTF-8 charset header, 
# and HTML body which is UTF-8 encoded 
response = urllib2.urlopen(request) 

# Parse with BeautifulSoup 
soup = BeautifulSoup(response) 

# Print title attribute of a <div> which uses umlauts (e.g. können) 
print repr(soup.find('div', id='navbutton_account')['title']) 

चल रहा है इस परिणाम देता है:

# u'Hier k\u0102\u015bnnen Sie sich kostenlos registrieren und/oder einloggen!' 

लेकिन मैं एक अजगर यूनिकोड स्ट्रिंग \xf6 के रूप में शब्द können में ö रेंडर करने के लिए उम्मीद करेंगे:

# u'Hier k\xf6bnnen Sie sich kostenlos registrieren und/oder einloggen!' 

मैंने 'से गुज़रने की कोशिश की है सुंदर सूप को एन्कोडिंग 'पैरामीटर, और read() और decode()response ऑब्जेक्ट की कोशिश कर रहा है, लेकिन यह कोई फर्क नहीं पड़ता है, या कोई त्रुटि फेंकता है।

 20 74 69 74 6c 65 3d 22 48 69 65 72 20 6b c3 b6 | title="Hier k..| 
     6e 6e 65 6e 20 53 69 65 20 73 69 63 68 20 6b 6f |nnen Sie sich ko| 
     73 74 65 6e 6c 6f 73 20 72 65 67 69 73 74 72 69 |stenlos registri| 

मैं अपने अजगर क्षमताओं के सीमा से परे हूँ:

आदेश curl www.voxnow.de | hexdump -C साथ

, मैं देख सकते हैं कि वेब पेज वास्तव में UTF-8 एन्कोडेड है ö चरित्र के लिए (यानी यह 0xc3 0xb6 शामिल हैं) , इसलिए मुझे इस बात पर एक नुकसान हुआ है कि इसे आगे कैसे डिबग करें। कोई सलाह?

+0

अजीब .. के रूप में '\ u0102 \ u015b '' Ăś'' है .. – aIKid

+2

क्या यह इस प्रश्न का डुप्लिकेट नहीं है: http://stackoverflow.com/questions/7219361/python-and-beautifulsoup-encoding-issues?rq=1 – justhalf

+0

@justhalf मुझे लगता है कि मैंने यह प्रश्न देखा है, लेकिन नहीं मुझे लगता है कि मुझे एक ही परिणाम मिल गया है। लेकिन मैं फिर से जांच करूंगा, धन्यवाद। –

उत्तर

19

justhalf ऊपर बताते हैं के रूप में, मेरे सवाल का यहाँ अनिवार्य रूप से this question का डुप्लिकेट है।

एचटीएमएल सामग्री ने स्वयं को यूटीएफ -8 एन्कोडेड के रूप में रिपोर्ट किया और, अधिकांश भाग के लिए, एक या दो दुष्ट अमान्य यूटीएफ -8 अक्षरों को छोड़कर।

जाहिरा तौर पर BeautifulSoup जिसके बारे में एन्कोडिंग उपयोग में है, और confuses जब UTF-8 के रूप में पहली डिकोड करने की कोशिश कर जब सामग्री गुजर इस तरह BeautifulSoup रहे हैं:

soup = BeautifulSoup(response.read().decode('utf-8')) 

मैं त्रुटि मिलेगा:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 186812-186813: 
        invalid continuation byte 

उत्पादन में और अधिक बारीकी से देख रहे हैं, वहाँ चरित्र Ü जो गलत तरीके से अवैध बाइट क्रम 0xe3 0x9c के रूप में एन्कोड किया गया था का एक उदाहरण है, बजाय सही ०१२३०१९२०३ था।

वर्तमान में highest-rated answer उस सवाल पर के रूप में पता चलता है, अवैध UTF-8 वर्णों ताकि केवल मान्य डेटा BeautifulSoup को पारित कर दिया है, जबकि पार्स करने हटाया जा सकता है,:

soup = BeautifulSoup(response.read().decode('utf-8', 'ignore')) 
3

utf-8 लिए परिणाम एन्कोडिंग मेरे लिए काम करने लगता है:

print (soup.find('div', id='navbutton_account')['title']).encode('utf-8') 

यह पैदावार:

Hier können Sie sich kostenlos registrieren und/oder einloggen! 
+0

हम्म .. मैंने कुछ मशीनों (पायथन 2.7.3 के साथ) पर प्रयास किया; वह कोड मुझे 'ö' चरित्र के लिए प्राप्त होने वाले दो स्थानों के स्थान पर चार बाइट देता है: 'c4 82 c5 9b' –

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