2010-08-05 15 views
10

मैं अजगर 2.7 करने के लिए स्थानांतरित करने के लिए कोशिश कर रहा हूँ और जब से यूनिकोड एक बिग डील हो तो मैं एक्सएमएल फाइल और टेक्स्ट के साथ उन लोगों के साथ निपटने की कोशिश और xml.etree.cElementTree पुस्तकालय का उपयोग कर उन्हें पार्स चाहते हैं। लेकिन मैं इस त्रुटि के पार भाग गया:पायथन: यूनिकोड और ElementTree.parse

>>> import xml.etree.cElementTree as ET 
>>> from io import StringIO 
>>> source = """\ 
... <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
... <root> 
... <Parent> 
...  <Child> 
...  <Element>Text</Element> 
...  </Child> 
... </Parent> 
... </root> 
... """ 
>>> srcbuf = StringIO(source.decode('utf-8')) 
>>> doc = ET.parse(srcbuf) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 56, in parse 
    File "<string>", line 35, in parse 
cElementTree.ParseError: no element found: line 1, column 0 

एक ही बात io.open('filename.xml', encoding='utf-8') का उपयोग कर ET.parse को पारित करने के लिए होता है:

>>> with io.open('test.xml', mode='w', encoding='utf-8') as fp: 
...  fp.write(source.decode('utf-8')) 
... 
150L 
>>> with io.open('test.xml', mode='r', encoding='utf-8') as fp: 
...  fp.read() 
... 
u'<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\n<root>\n <Parent>\n 
    <Child>\n  <Element>Text</Element>\n </Child>\n </Parent>\n</root>\n 
' 
>>> with io.open('test.xml', mode='r', encoding='utf-8') as fp: 
...  ET.parse(fp) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "<string>", line 56, in parse 
    File "<string>", line 35, in parse 
cElementTree.ParseError: no element found: line 1, column 0 

वहाँ यूनिकोड और ईटी पार्स कि मैं यहाँ याद आ रही है के बारे में कुछ है?

संपादित: जाहिर है, एट पार्सर यूनिकोड इनपुट धारा के साथ अच्छी तरह से नहीं चलता है? निम्नलिखित काम करता है:

>>> with io.open('test.xml', mode='rb') as fp: 
...  ET.parse(fp) 
... 
<ElementTree object at 0x0180BC10> 

लेकिन यह भी मतलब है मैं io.StringIO उपयोग नहीं कर सकते अगर मैं एक में स्मृति पाठ से पार्स करने के लिए चाहते हैं, जब तक कि मैं यह पहली बार एक में स्मृति बफर में सांकेतिक शब्दों में बदलना?

उत्तर

3

आप अपने पहले उदाहरण में

doc = ET.fromstring(source) 

का उपयोग नहीं कर सकते हैं?

+0

मुझे एहसास नहीं हुआ कि कार्य मौजूद था। मामूली बिंदु हालांकि: 'सेस्ट्रिंग' एक 'एलिमेंट' देता है, जबकि 'पार्स'' एलिमेंट ट्री 'देता है। – Santa

+1

इस फ़ंक्शन को इसके उपनाम, 'एक्सएमएल', यानी' xml.etree.cElementTree आयात XML 'के रूप में भी जाना जाता है। यह उपनाम वहां है ताकि यदि आपके कोड में एक्सएमएल स्थिर है तो यह अच्छी तरह से पढ़ेगा; आप बस 'fooDocument = XML ("" "..." "" ") कर सकते हैं। – Glyph

6

मुझे पाइथन 2.6 में आपके जैसा ही समस्या आई।

ऐसा लगता है कि पायथन 2.x और 3.x संस्करण में cElementTree.parse के लिए "utf-8" एन्कोडिंग अलग है। पायथन 2.x में, हम यूनिकोड को एन्कोड करने के लिए XMLParser का उपयोग कर सकते हैं। उदाहरण के लिए: http://effbot.org/zone/elementtree-13-intro.htm

निम्न विधि पायथन 3.x संस्करण के लिए काम करता है:

import xml.etree.cElementTree as etree 
import codecs 

target_file = codecs.open("./targetPageID.xml",mode='r',encoding='utf-8') 

targetTree = etree.parse(target_file) 
pageIds = targetTree.find("categorymembers") 
print "pageIds:",etree.tostring(pageIds) 

import xml.etree.cElementTree as etree 

parser = etree.XMLParser(encoding="utf-8") 
targetTree = etree.parse("./targetPageID.xml", parser=parser) 
pageIds = targetTree.find("categorymembers") 
print "pageIds:",etree.tostring(pageIds) 

आप XMLParser विधि (खंड "XMLParser") के लिए इस पेज का उल्लेख कर सकते

उम्मीद है कि यह आपकी मदद कर सकता है।

+1

यह सही प्रकार का है, लेकिन ElementTree संस्करण पाइथन 2 और पायथन 3 के बीच क्रेडिट के मुकाबले अधिक समान हैं। मुझे लगता है कि मैं एक अलग जवाब लिखूंगा। – Glyph

13

आपकी समस्या यह है कि आप ElementTree यूनिकोड खिला रहे हैं, लेकिन बाइट्स उपभोग करने के लिए पसंद करता है। यह किसी भी मामले में यूनिकोड के साथ प्रदान करेगा।

पायथन 2.x में, यह केवल बाइट्स का उपभोग कर सकता है। आप यह बता सकते हैं कि उन बाइट्स में एन्कोडिंग क्या है, लेकिन यह है। इसलिए, यदि आपको सचमुच किसी ऑब्जेक्ट के साथ काम करना है जो टेक्स्ट फ़ाइल का प्रतिनिधित्व करता है, जैसे io.StringIO, तो पहले आपको इसे किसी अन्य रूप में परिवर्तित करने की आवश्यकता होगी।

आप सचमुच एक 2.x- str (उर्फ bytes) UTF-8 एन्कोडिंग में के साथ शुरू कर रहे हैं, स्मृति में, अपने उदाहरण के रूप में, xml.etree.cElementTree.XML का उपयोग एक्सएमएल में पार्स करने के लिए एक में गिर गई स्वूप और चिंता मत करो इनमें से किसी के बारे में :-)।

आप एक अंतरफलक है कि डेटा कि संवर्द्धित एक फ़ाइल से पढ़ा जाता है के साथ सौदा कर सकते हैं चाहते हैं, एक io.BytesIO साथ xml.etree.cElementTree.parse का उपयोग यह पात्रों में से एक में स्मृति स्ट्रिंग बाइट्स की एक में स्मृति धारा के बजाय में परिवर्तित करने के।यदि आप io.open का उपयोग करना चाहते हैं, तो इसे b ध्वज के साथ उपयोग करें, ताकि आपको बाइट्स की धाराएं मिलें।

अजगर 3.x में, ElementTree, जो थोड़ा अधिक सुविधाजनक है, और यकीनन ElementTree के नए संस्करण पर इसकी अनुमति नहीं अधिक सही है करने के लिए आप सीधे कर सकते हैं पास यूनिकोड। हालांकि, आप अभी भी नहीं चाहते हैं, और पायथन 3 का संस्करण अभी भी इनपुट के रूप में बाइट स्वीकार करता है। आप हमेशा बाइट्स से शुरू कर रहे हैं: उन्हें सीधे अपने इनपुट स्रोत से एलिमेंट ट्री तक पास करके, आप इसे एक्सएमएल पार्सिंग इंजन के अंदर बुद्धिमानी से एन्कोडिंग या डिकोडिंग करने देते हैं, साथ ही एन्कोडिंग घोषणाओं के ऑन-द-फ्लाई डिटेक्शन इनपुट स्ट्रीम के भीतर, जो आप एक्सएमएल के साथ कर सकते हैं लेकिन आप मनमाना पाठ डेटा के साथ नहीं कर सकते हैं। तो एक्सएमएल पार्सर को डिकोडिंग का काम करने देना उस जिम्मेदारी को रखने का सही स्थान है।

+6

मेरी इच्छा है कि आपने कुछ उदाहरण कोड जोड़ा होगा – Mawg

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