2009-03-01 19 views
96

यह निश्चित रूप से एक आसान होगा लेकिन यह वास्तव में मुझे परेशान कर रहा है।पायथन स्ट्रिंग प्रिंट [u'String ']

मेरे पास एक स्क्रिप्ट है जो वेबपृष्ठ में पढ़ती है और इसे पार्स करने के लिए Beautiful Soup का उपयोग करती है। सूप से मैं सभी लिंक निकालता हूं क्योंकि मेरा अंतिम लक्ष्य link.contents को मुद्रित करना है।

मैं जिस पाठ को पार्सिंग कर रहा हूं वह ASCII है। मुझे पता है कि पायथन स्ट्रिंग को यूनिकोड के रूप में मानता है, और मुझे यकीन है कि यह बहुत आसान है, मेरी वी स्क्रिप्ट में इसका कोई उपयोग नहीं है।

हर बार जब मैं 'स्ट्रिंग' धारण करने वाले चर को प्रिंट करने के लिए जाता हूं तो मुझे स्क्रीन पर मुद्रित [u'String'] मिलता है। क्या इसे वापस एसीसी में लाने का एक आसान तरीका है या क्या मुझे इसे रोकने के लिए एक रेगेक्स लिखना चाहिए?

उत्तर

82

[u'ABC'] यूनिकोड तारों की एक-तत्व सूची होगी। Beautiful Soup always produces Unicode। तो आपको सूची को एक यूनिकोड स्ट्रिंग में कनवर्ट करने की आवश्यकता है, और उसके बाद इसे ASCII में परिवर्तित करें।

मुझे नहीं पता कि आपको एक-तत्व सूचियां कैसे मिलीं; सामग्री सदस्य स्ट्रिंग्स और टैग की एक सूची होगी, जो स्पष्ट रूप से आपके पास नहीं है। यह मानते हुए कि आप वास्तव में हमेशा एक ही तत्व के साथ एक सूची प्राप्त है, और है कि अपने परीक्षण वास्तव में केवल ASCII है आप इस का प्रयोग करेंगे:

soup[0].encode("ascii") 

हालांकि, कृपया दोबारा जांच करें कि आपके डेटा वास्तव में ASCII है। यह बहुत दुर्लभ है। अधिक संभावना है कि यह लैटिन -1 या यूटीएफ -8 है।

soup[0].encode("latin-1") 


soup[0].encode("utf-8") 

या आप ब्यूटीफुल सूप क्या मूल एन्कोडिंग था पूछने के लिए और यह इस एन्कोडिंग में वापस पाने:

soup[0].encode(soup.originalEncoding) 
+0

शानदार। धन्यवाद। टाइपो के लिए माफी। – gnuchu

+6

आपको वास्तव में एन्कोडिंग करने की आवश्यकता नहीं है, क्योंकि ओपी केवल स्ट्रिंग रिप्रर को देख रहा है क्योंकि जब आप किसी सूची को मुद्रित करते हैं तो आप कुछ भी देखते हैं।सूप [0] repr की बजाय स्ट्र को दिखाने के लिए पर्याप्त होगा, स्ट्रिंग की सामग्री दिखा रहा है और उद्धरण और यूनिकोड संशोधक नहीं। – ironfroggy

+2

आपको ज्यादातर मामलों में यूनिकोड के रूप में प्रतिनिधित्व किए गए पाठ को एन्कोड नहीं करना चाहिए: आपको यूनिकोड को सीधे पायथन में प्रिंट करना चाहिए: ['प्रिंट (',' .join ([u'ABC ', u' ... '])) '] (http://stackoverflow.com/a/36891685/4279) – jfs

1

क्या आपका वास्तव में u'String' है?

किसी भी घटना में, क्या आप यूनिकोड-स्ट्रिंग की बजाय स्ट्रिंग प्राप्त करने के लिए str(string) नहीं कर सकते हैं? (यह पाइथन 3 के लिए अलग होना चाहिए, जिसके लिए सभी तार यूनिकोड हैं।)

+0

मुझे स्पष्ट होना चाहिए था। मैं str() का उपयोग कर रहा हूं लेकिन जब भी मैं प्रिंट करता हूं तब भी नीचे आउटपुट प्राप्त कर रहा हूं। [u'ABC '] [u'DEF'] [u'GHI '] [u'JKL'] डेटा वेबपृष्ठ से पाठ के रूप में छीन लिया जाता है, तो एक डेटाबेस में डाला (गूगल एपस्टोर) , फिर पुनर्प्राप्त और मुद्रित। – gnuchu

0

dir या type 'स्ट्रिंग' पर यह पता लगाने के लिए कि यह क्या है। मुझे संदेह है कि यह सुंदर सूप की टैग ऑब्जेक्ट्स में से एक है, जो एक स्ट्रिंग की तरह प्रिंट करता है, लेकिन वास्तव में एक नहीं है। अन्यथा, यह एक सूची के अंदर है और आपको प्रत्येक स्ट्रिंग को अलग से बदलने की आवश्यकता है।

किसी भी मामले में, आप यूनिकोड का उपयोग करने का विरोध क्यों कर रहे हैं? कोई विशिष्ट कारण?

+0

मैं पिछले कुछ दिनों से सुंदर सूप देख रहा हूं। मैं यह नहीं समझ सका कि कैसे gnuchu आपको ['स्ट्रिंग'] नहीं मिलेगा [u'String ']। एंड्रयू जाफ को उनकी टिप्पणी साबित होती है कि यह एक सूची है। – batbrat

+0

उसे मछली पकड़ने और उसे देने के बजाए मछली को पढ़ाने पर +1। – batbrat

18

आप शायद एक यूनिकोड स्ट्रिंग वाली एक सूची है। repr इसमें से [u'String'] है।

आप निम्न में से किसी भी परिवर्तन का उपयोग बाइट स्ट्रिंग की एक सूची में कनवर्ट कर सकते हैं:

# Functional style. 
print map(lambda x: x.encode('ascii'), my_list) 

# List comprehension. 
print [x.encode('ascii') for x in my_list] 

# Interesting if my_list may be a tuple or a string. 
print type(my_list)(x.encode('ascii') for x in my_list) 

# What do I care about the brackets anyway? 
print ', '.join(repr(x.encode('ascii')) for x in my_list) 

# That's actually not a good way of doing it. 
print ' '.join(repr(x).lstrip('u')[1:-1] for x in my_list) 
+4

जीत – Jimmy

+1

जीतने के लिए सूची समझ कृपया, कृपया 'repr (x) .lstrip (' u ') [1: -1]' के रूप में ऐसी भयावहताओं से बचें। यूनिकोड स्ट्रिंग्स की सूची को प्रारूपित करने के लिए, जैसे 'प्रिंट करें "," .join (my_list)' जैसे कुछ का उपयोग करें। – jfs

+1

टिप्पणी, यह कहती है: "यह वास्तव में ऐसा करने का एक अच्छा तरीका नहीं है"। यह सिर्फ लॉज के लिए यहाँ है! – ddaa

6

हैं तक पहुँचने/मुद्रण एक तत्व सूचियों (जैसे, क्रमिक रूप से या फ़िल्टर किए गए):

my_list = [u'String'] # sample element 
my_list = [str(my_list[0])] 
+1

क्या होगा यदि 'my_list = [u'String', u'String ', u'String', u'String ']' इस तरह दिखें ... –

+1

आप एक सूची समझते हैं: 'my_list = [str (my_list [x ]) एक्स में रेंज के लिए (लेन (my_list))] ' – gevang

4

आउटपुट को str() फ़ंक्शन पर पास करें और यह यूनिकोड आउटपुट को कन्वर्ट कर देगा। आउटपुट प्रिंट करके भी यह आपके 'टैग' को हटा देगा।

-1

encode("latin-1") मेरे मामले में मुझे मदद मिली:

facultyname[0].encode("latin-1") 
0

[u'String'] कि अजगर पर एक यूनिकोड स्ट्रिंग एक सूची का एक पाठ प्रतिनिधित्व है 2.

आप print(some_list) चलाते हैं तो यह
के बराबर है print'[%s]' % ', '.join(map(repr, some_list)) यानी, list के साथ एक पायथन ऑब्जेक्ट का टेक्स्ट प्रस्तुति बनाने के लिए, प्रत्येक आइटम के लिए repr() फ़ंक्शन कहा जाता है। repr(repr('a')) != repr('a'): repr('a') != 'a' और पाठ प्रतिनिधित्व की भी पाठ प्रतिनिधित्व अलग है -

एक अजगर वस्तु और उसके पाठ प्रतिनिधित्व भ्रमित न हों।

repr(obj) एक स्ट्रिंग देता है जिसमें किसी ऑब्जेक्ट का प्रिंट करने योग्य प्रतिनिधित्व होता है। इसका उद्देश्य एक वस्तु का एक स्पष्ट प्रतिनिधित्व होना है जो एक आरईपीएल में डीबगिंग के लिए उपयोगी हो सकता है। अक्सर eval(repr(obj)) == obj

repr() बुला, आप सूची के आइटम सीधे प्रिंट कर सकता है (अगर वे सभी यूनिकोड तार कर रहे हैं) से बचने के लिए उदाहरण के लिए: print ",".join(some_list) -यह तार के एक अल्पविराम से अलग सूची प्रिंट: String

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

3
import json, ast 
r = {u'name': u'A', u'primary_key': 1} 
ast.literal_eval(json.dumps(r)) 

{'name': 'A', 'primary_key': 1} 
+1

यह विधि मेरे लिए बहुत प्यारी लगती है, क्यों वोट नहीं? किसी भी प्रदर्शन प्रभाव के बारे में हमें चिंता करनी चाहिए? – jrich523

-1

हो सकता है कि मुझे समझ न प्रिंट होगा, क्यों तुम सिर्फ element.text मिलता है और फिर इसे उपयोग करने से पहले परिवर्तित नहीं कर सकते? उदाहरण के लिए (न जानते हो क्यों आप इस लेकिन करना होगा ...) वेब पेज के सभी लेबल तत्व खोजने के लिए और उन दोनों के बीच पुनरावृति जब तक आप MyText

 avail = [] 
     avail = driver.find_elements_by_class_name("label"); 
     for i in avail: 
       if i.text == "MyText": 

स्ट्रिंग कहा जाता कन्वर्ट एक मैं से खोजने के लिए और कर जो कुछ भी आप करना चाहते थे ... शायद मूल संदेश में कुछ याद आ रही है? या यह वह था जिसे आप ढूंढ रहे थे?

+0

आप उस भाग को याद कर रहे हैं जहां प्रश्न * के बारे में है * कैसे करें "स्ट्रिंग को i से कनवर्ट करें"। –

+0

आह, सभी टिप्पणियों से धन्यवाद, मैंने सोचा कि समस्या – Steven

+0

को बदलने के लिए मूल्य प्राप्त कर रही थी, लेकिन उचित i.text होने के लिए वास्तविक स्ट्रिंग मान है, "इसे किसी सरणी से बाहर खींचने" की आवश्यकता नहीं है कुछ लोगों को सुझाए गए सुझाव यदि उदाहरण के लिए लेबल elemet का टेक्स्ट मान है [u'String '] i.text स्ट्रिंग होगा – Steven

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