मैं एक एक्सएमएल फ़ाइल को पार्स करने की कोशिश कर रहा हूं जो कि 2 जीबी से अधिक है जो पाइथन की एलएक्सएमएल लाइब्रेरी के साथ है। दुर्भाग्यवश, एक्सएमएल फ़ाइल में वर्ण एन्कोडिंग को एक पंक्ति नहीं है, इसलिए मुझे इसे मैन्युअल रूप से सेट करना होगा। हालांकि फ़ाइल के माध्यम से पुनरावृत्ति करते हुए, अभी भी कुछ अजीब पात्र हैं जो थोड़ी देर में आते हैं।एक बड़ी एक्सएमएल फ़ाइल को पार्स करते समय मैं Python के lxml में XMLSyntaxError से कैसे निपटूं?
मुझे यकीन नहीं है कि लाइन के चरित्र एन्कोडिंग को कैसे निर्धारित किया जाए, लेकिन इसके अलावा, lxml लूप के दायरे से XMLSyntaxError को बढ़ाएगा। मैं इस त्रुटि को सही तरीके से कैसे पकड़ सकता हूं, और इसके साथ सही तरीके से निपट सकता हूं?
from lxml import etree
etparse = etree.iterparse(file("my_file.xml", 'r'), events=("start",), encoding="CP1252")
for event, elem in etparse:
if elem.tag == "product":
print "Found the product!"
elem.clear()
यह अंततः त्रुटि पैदा करता है: यहाँ एक साधारण कोड का टुकड़ा है
XMLSyntaxError: PCDATA invalid Char value 31, line 1565367, column 50
फ़ाइल का यह लाइन इस तरह दिखता है:
% sed -n "1565367 p" my_file.xml
<romance_copy>Ravioli Florentine. Tender Ravioli Filled With Creamy Ricotta Cheese And
भरा के 'एफ' वास्तव में मेरे टर्मिनल में ऐसा लगता है:
क्या आपने पहले ही एन्कोडिंग के लिए "utf-8" की कोशिश की है? – jsbueno
@jsbueno: समस्या "F" में "F" से ठीक पहले वर्ण है, जिसमें 31 (दशमलव) या 0x1F का मान है। यह एक्सएमएल विनिर्देश के प्रति एक अमान्य चरित्र है, इसलिए यूटीएफ -8 एन्कोडिंग का उपयोग करने के लिए यह एक फर्क नहीं पड़ता है। प्रश्न यह है कि खराब वर्णों से अधिक सावधानीपूर्वक सामना करने के लिए lxml कैसे प्राप्त करें (यानी अपवाद नहीं फेंकें)। मुझे lxml दस्तावेज़ में ऐसा करने का विकल्प नहीं मिला। –