2012-04-20 9 views
8

मैं lxml का उपयोग कर एक HTML दस्तावेज़ को पार्स करना चाहता हूं। मैं अजगर 3.2.3 और lxml 2.3.4 (http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml)lxml etree.iterparse त्रुटि "TypeError: फ़ाइल ऑब्जेक्ट्स को पढ़ने के लिए सादे तारों को वापस करना होगा"

मैं etree.iterparse उपयोग कर रहा हूँ दस्तावेज़ को पार्स करने का उपयोग कर रहा है, लेकिन यह निम्नलिखित रन-टाइम त्रुटि देता है:

Traceback (most recent call last): 
    File "D:\Eclipse Projects\Python workspace\Crawler\crawler.py", line 12, in <module> 
    for event, elements in etree.iterparse(some_file_like): 
    File "iterparse.pxi", line 491, in lxml.etree.iterparse.__next__ (src/lxml\lxml.etree.c:98565) 
    File "iterparse.pxi", line 512, in lxml.etree.iterparse._read_more_events (src/lxml\lxml.etree.c:98768) 
TypeError: reading file objects must return plain strings 

सवाल यह है: इस रन-टाइम त्रुटि को कैसे हल करें?

बहुत बहुत धन्यवाद।

यहाँ कोड है:

from io import StringIO 
from lxml import etree 

some_file_like = StringIO("<root><a>data</a></root>") 

for event, elements in etree.iterparse(some_file_like): #<-- Run-time error happens here 
    print("%s, %4s, %s" % (event, elements.tag, elements.text)) 

उत्तर

18

आपका StringIO बफर यूनिकोड स्ट्रिंग है। iterparse बाइट्स लौटने वाली ऑब्जेक्ट्स जैसी फाइलों के साथ काम करता है। निम्नलिखित बफर को इसके साथ काम करना चाहिए:

from io import BytesIO 
some_file_like = BytesIO("<root><a>data</a></root>".encode('utf-8')) 
+0

प्रतिक्रिया के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की लेकिन उसने निम्नलिखित रन-टाइम त्रुटि दी: TypeError: प्रारंभिक_वल्यू स्ट्रेट या कोई नहीं होना चाहिए, बाइट्स –

+0

स्पष्ट रूप से आपको बाइट्स के लिए 'बाइट्सियो' और तारों के लिए 'स्ट्रिंगियो' का उपयोग करने की आवश्यकता नहीं है (पुराने 'स्ट्रिंगियो' के विपरीत जो कि दोनों के लिए इस्तेमाल किया जाना चाहिए)। मेरा जवाब तय किया। – Imran

+0

आपका सुधार काम करता है। धन्यवाद :) –

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