2009-03-10 11 views
5

मैं वेबसाइट को स्क्रैप करने के लिए सुंदर सूप का उपयोग कर रहा हूं। वेबसाइट का पेज मेरे ब्राउज़र में ठीक है:सुंदर सूप सीधे यूनिकोड की बजाय यूनिकोड + एचटीएमएल प्रतीक देता है। क्या यह एक बग या गलतफहमी है?

ऑक्सफैम इंटरनेशनल की रिपोर्ट "ऑफसाइड" http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271

विशेष रूप से, सिंगल और डबल उद्धरण ठीक लग। वे एएससीआई के बजाय एचटीएमएल प्रतीकों को देखते हैं, हालांकि जब मैं एफएफ 3 में स्रोत देखता हूं तो आश्चर्यजनक रूप से वे सामान्य एसीआईआई दिखाई देते हैं।

दुर्भाग्य से, जब मैं खुरच मैं इस

u'Oxfam इंटरनेशनल की तरह कुछ \ XE2 € ™ के रिपोर्ट हकदार \ XE2 € œOffside प्राप्त करें!

उफ़, मेरा मतलब है इस:

u'Oxfam International\xe2€™s report entitled \xe2€œOffside! 

पेज के मेटा डेटा इंगित करता है 'आईएसओ 88,959-1' एन्कोडिंग। मैंने अलग-अलग एन्कोडिंग की कोशिश की है, यूनिकोड-> एएससीआई और एचटीएमएल-> एसीआईआई तीसरे पक्ष के कार्यों के साथ खेला, और एमएस/आईएसओ -885 9 -1 विसंगति को देखा, लेकिन इस तथ्य का तथ्य यह है कि ™ के पास कुछ भी नहीं है एकल उद्धरण, और मैं अपने सीमित ज्ञान में, यूनिकोड + htmlsymbol कॉम्बो को सही ascii या HTML प्रतीक में बदलना प्रतीत नहीं कर सकता, यही कारण है कि मैं मदद की तलाश में हूं।

मैं, एक ascii दोहरे उद्धरण के साथ खुशी होगी "या"

समस्या निम्नलिखित है कि मैं चिंतित अन्य अजीब प्रतीकों देखते हैं गलत तरीके से डीकोड कर रहा हूँ।

\xe2€™ 

नीचे जो कुछ मैंने देखा है, उसके बाद पुन: उत्पन्न करने के लिए कुछ अजगर नीचे है।

import twill 
from twill import get_browser 
from twill.commands import go 

from BeautifulSoup import BeautifulSoup as BSoup 

url = 'http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271' 
twill.commands.go(url) 
soup = BSoup(twill.commands.get_browser().get_html()) 
ps = soup.body("p") 
p = ps[52] 

>>> p   
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe2' in position 22: ordinal not in range(128) 

>>> p.string 
u'Oxfam International\xe2€™s report entitled \xe2€œOffside!<elided>\r\n' 

http://groups.google.com/group/comp.lang.python/browse_frm/thread/9b7bb3f621b4b8e4/3b00a890cf3a5e46?q=htmlentitydefs&rnum=3&hl=en#3b00a890cf3a5e46

http://www.fourmilab.ch/webtools/demoroniser/

http://www.crummy.com/software/BeautifulSoup/documentation.html

http://www.cs.tut.fi/~jkorpela/www/windows-chars.html

>>> AsciiDammit.asciiDammit(p.decode()) 
u'<p>Oxfam International\xe2€™s report entitled \xe2€œOffside! 

>>> handle_html_entities(p.decode()) 
u'<p>Oxfam International\xe2\u20ac\u2122s report entitled \xe2\u20ac\u0153Offside! 

>>> unicodedata.normalize('NFKC', p.decode()).encode('ascii','ignore') 
'<p>Oxfam International€™s report entitled €œOffside! 

>>> htmlStripEscapes(p.string) 
u'Oxfam International\xe2TMs report entitled \xe2Offside! 

संपादित करें:

,210

मैं एक अलग बी एस पार्सर का उपयोग कर की कोशिश की है:

import html5lib 
bsoup_parser = html5lib.HTMLParser(tree=html5lib.treebuilders.getTreeBuilder("beautifulsoup")) 
soup = bsoup_parser.parse(twill.commands.get_browser().get_html()) 
ps = soup.body("p") 
ps[55].decode() 

जो मुझे देता है इस

u'<p>Oxfam International\xe2\u20ac\u2122s report entitled \xe2\u20ac\u0153Offside! 

सबसे अच्छा मामले डिकोड मुझे देने के लिए एक ही परिणाम लगता है:

unicodedata.normalize('NFKC', p.decode()).encode('ascii','ignore') 
'<p>Oxfam InternationalTMs report entitled Offside! 

संपादित करें 2:

मैं एफएफ 3.0 के साथ मैक ओएस एक्स 4 चला रहा हूं।7 और Firebug

अजगर 2.5 (वाह, मैं विश्वास नहीं कर सकता शुरू से ही इस राज्य नहीं था)

+0

क्या "उफ़ मैं इस का क्या मतलब है "मतलब है? क्या आपकी बैकस्पेस कुंजी काम नहीं करती? –

+0

@ एसएलओटी: मैक में बैकस्पेस कुंजी है? – SilentGhost

+3

@SilentGost: मेरे प्रत्येक मैक पर एक है। "ओह, मेरा मतलब यह है" बहुत, बहुत परेशान है। बैकस्पेस क्यों नहीं? एक अलग मार्कअप में एक ही अक्षर दोहराने के बारे में इतना महत्वपूर्ण क्या है? ये मज़ाकिया है"? –

उत्तर

8

यह एक गंभीर रूप से पेज, एन्कोडिंग के लिहाज से :-)

में गड़बड़ है कुछ भी सच है आपके दृष्टिकोण के साथ गलत है। शायद मैं इसे BeautifulSoup को पार करने से पहले रूपांतरण करते हैं, सिर्फ इसलिए कि मैं persnickity हूँ:

import urllib 
html = urllib.urlopen('http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271').read() 
h = html.decode('iso-8859-1') 
soup = BeautifulSoup(h) 

इस मामले में, पेज का मेटा टैग एन्कोडिंग के बारे में झूठ बोल रही है। पेज utf-8 में वास्तव में है ... Firefox के पेज की जानकारी वास्तविक एन्कोडिंग का पता चलता है, और आप वास्तव में सर्वर द्वारा लौटाए प्रतिक्रिया हेडर में इस चारसेट देख सकते हैं:

curl -i http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271 
HTTP/1.1 200 OK 
Connection: close 
Date: Tue, 10 Mar 2009 13:14:29 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Set-Cookie: COMPANYID=271;path=/ 
Content-Language: en-US 
Content-Type: text/html; charset=UTF-8 

आप उपयोग कर डिकोड करते हैं 'utf -8 ', यह आप के लिए काम करेंगे (या कम से कम, है था मेरे लिए):

import urllib 
html = urllib.urlopen('http://www.coopamerica.org/programs/responsibleshopper/company.cfm?id=271').read() 
h = html.decode('utf-8') 
soup = BeautifulSoup(h) 
ps = soup.body("p") 
p = ps[52] 
print p 
+0

जानकारीपूर्ण और सौम्य प्रतिक्रिया के लिए आपको बहुत बहुत धन्यवाद। यह वास्तव में मेरे लिए भी काम करता है। –

4

यह वास्तव में UTF-8 CP1252 के रूप में misencoded है:

>>> print u'Oxfam International\xe2€™s report entitled \xe2€œOffside!'.encode('cp1252').decode('utf8') 
Oxfam International’s report entitled “Offside! 
संबंधित मुद्दे