2011-11-25 19 views
11

सहेजने में मैंने पिछले कुछ दिनों में एलएक्सएमएल की मूल बातें के साथ पकड़ने के लिए बिताया है; विशेष रूप से lxml.html का उपयोग वेबसाइटों को पार्स करने और सामग्री के ElementTree बनाने के लिए। आदर्श रूप में, मैं लौटाए गए एलिमेंटट्री को सहेजना चाहता हूं ताकि जब भी मैं अपनी स्क्रिप्ट को संशोधित करता हूं, वेबसाइट को पार्स किए बिना मैं इसे लोड और प्रयोग कर सकता हूं। मैंने माना कि पिकलिंग जाने का रास्ता होगा, हालांकि अब मैं आश्चर्यचकित होना शुरू कर रहा हूं। हालांकि मैं अचार बनाने के बाद एक ElementTree वस्तु पुनः प्राप्त करने के ...एक 'lxml.etree._ElementTree' ऑब्जेक्ट

type(myObject) 

रिटर्न

<class 'lxml.etree._ElementTree'> 

वस्तु ही 'खाली' हो सकता है, बाद में विधि से कोई भी के बाद से प्रकट होता है में सक्षम हूँ/विशेषता मैं कॉल इस पर कोई आउटपुट उत्पन्न होता है।

मेरा अनुमान है कि पिकलिंग यहां उचित नहीं है, लेकिन क्या कोई वैकल्पिक विकल्प सुझा सकता है?

(मामले में यह मायने रखती है, इसके बाद के संस्करण में हो रहा है: python3.2, lxml 2.3.2, बर्फ से तेंदुआ))

उत्तर

18

आप पहले ही एक्सएमएल से निपट रहे हैं, और lxml XML को पार्स करने में बहुत अच्छा है। तो मुझे लगता है एक्सएमएल को क्रमानुसार करने होगा करने के लिए सरल बात:

दायर करने के लिए लिखने के लिए:

import lxml.etree as ET 

filename = '/tmp/test.xml' 
myobject.write(filename) 

write विधि कॉल करने के लिए, ध्यान दें कि myobject एक lxml.etree._ElementTree होना चाहिए। यदि यह lxml.etree._Element है, तो आपको myobject.getroottree().write(filename) की आवश्यकता होगी।

फ़ाइल नाम/पथ, फ़ाइल वस्तु, या URL से पार्स करने के लिए:

myobject = ET.parse(file_or_url) 

स्ट्रिंग से पार्स करने के लिए:

myobject = ET.fromstring(content) 
+0

प्रतिक्रिया के लिए धन्यवाद। दुर्भाग्य से एलएक्सएमएल, तत्व पेड़, और जैसे की मेरी समझ इतनी स्केची है कि मैं वास्तव में आपके द्वारा किए गए सुझावों को समझ नहीं पा रहा हूं।मैंने पिछले कुछ दिनों में एलएक्सएमएल मैनुअल के माध्यम से घूमने की कोशिश की है लेकिन कहीं भी नहीं मिला है, इसलिए मैं इस परियोजना को समय के लिए छोड़ने जा रहा हूं। –

+1

सुझाए गए लेखन-विधि ने मुझे Python3 में एक त्रुटि मिली है, लेकिन 'w' से 'wb' में बदलकर यह काम करता है। – deinonychusaur

+0

@ टोमालक: सुधार के लिए बहुत बहुत धन्यवाद। – unutbu

3

मैं नहीं मानता कि आप lxml उदाहरणों अचार सकता है, लेकिन क्या मैं क्योंकि किया मैं इसी तरह की स्थिति में था कि मैंने ऑब्जेक्ट के उदाहरणों को उठाया जो पेड़ का निर्माण करेगा।

प्रत्येक उदाहरण और उसके बच्चे के पास एलिमेंट पेड़ बनाने के लिए एक कार्य था। तो मैं पाइथन ऑब्जेक्ट को आसानी से अचार/कैश कर दूंगा, इसे कैश से लाऊंगा, और फिर मेरा एलिमेंट पेड़ प्राप्त करने के लिए बिल्ड फ़ंक्शंस को कॉल करूंगा।

+0

धन्यवाद Bartek। जैसा कि मैंने उपरोक्त मेरी प्रतिक्रिया में उल्लेख किया है, यह स्पष्ट हो गया है कि मैं वास्तव में आपके उत्तर का उपयोग करने के लिए तत्व पेड़ और एलएक्सएमएल के बारे में पर्याप्त नहीं हूं, या यहां पोस्ट किए गए अन्य उत्तरों। उस ने कहा, मैंने कम से कम मेरे संदेह की पुष्टि की है कि इस उदाहरण में पिकलिंग का कोई उपयोग नहीं है। –

+0

@ बार्टक, क्या आप कुछ कोड दे सकते हैं, कृपया? –

13

एलएक्सएमएल एक सी लाइब्रेरी है - libxml सटीक होने के लिए - और ऑब्जेक्ट शायद पाइथन पिकलिंग या किसी अन्य प्रकार के क्रमबद्धरण का समर्थन नहीं करता है - उन्हें एक्सएमएल को क्रमबद्ध करने के अलावा।

तो आपको या तो उन्हें स्मृति में रखना होगा, या आपको आवश्यक एक्सएमएल टुकड़ों को फिर से पार्स करना होगा, मुझे लगता है।

+4

यह पुष्टि करना कि 'अचार' रिटर्न 'TypeError: _Element ऑब्जेक्ट्स' नहीं उठा सकता ... इस तरह मुझे यह प्रश्न मिला। – jamesc

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

  • कोई संबंधित समस्या नहीं^_^