2012-10-31 12 views
10

मैं lxml का उपयोग करके एक POST विधि प्रपत्र सबमिट करने का प्रयास कर रहा हूं और मुझे TypeError मिल रहा है। यह एक कम से कम उदाहरण है कि इस त्रुटि को जन्म देती है:lxml में POST विधि प्रपत्र सबमिट_फॉर्म के साथ TypeError

>>> import lxml.html 
>>> page = lxml.html.parse("http://www.webcom.com/html/tutor/forms/start.shtml") 
>>> form = page.getroot().forms[0] 
>>> form.fields['your_name'] = 'Morphit' 
>>> result = lxml.html.parse(lxml.html.submit_form(form)) 
    Traceback (most recent call last): 
      File "<stdin>", line 1, in <module> 
      File "/usr/lib/python3.3/site-packages/lxml/html/__init__.py", line 887, in submit_form 
       return open_http(form.method, url, values) 
      File "/usr/lib/python3.3/site-packages/lxml/html/__init__.py", line 907, in open_http_urllib 
       return urlopen(url, data) 
      File "/usr/lib/python3.3/urllib/request.py", line 160, in urlopen 
       return opener.open(url, data, timeout) 
      File "/usr/lib/python3.3/urllib/request.py", line 471, in open 
       req = meth(req) 
      File "/usr/lib/python3.3/urllib/request.py", line 1183, in do_request_ 
       raise TypeError(msg) 
      TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str. 

मैं कहीं और ऑनलाइन सटीक त्रुटि पाया है, लेकिन मैं नहीं देखा है इसे इस तरह lxml अंदर से उत्पन्न। क्या किसी को पता है कि यह एक बग है, या अपेक्षित व्यवहार और इसके आसपास कैसे काम करना है?

+1

को मैं क्योंकि यह के आंतरिक प्रबंधन है ही बग .. यह वास्तव में एक बग की तरह लगता है है str/यूनिकोड/बाइट्स। – abourget

+3

संदर्भ के लिए, मॉर्फिट ने [lxml के बग ट्रैकर] (https://bugs.launchpad.net/lxml/+bug/1074996) पर एक बग सबमिट किया, [प्रस्तावित पुल अनुरोध] (https://github.com/lxml/ एलएक्सएमएल/पुल/122) पैच को ठीक करने के लिए, प्रतिक्रिया के आधार पर भी इसे बेहतर बनाया। अफसोस की बात है, पुल अनुरोध अभी भी विलय होने का इंतजार कर रहा है! –

+0

@ मॉर्फिट: आप अपने प्रस्तावित पुल अनुरोध को यहां एक उत्तर के रूप में जोड़ सकते हैं। उस उत्तर को स्वीकार करें, ताकि यह अब अनुत्तरित प्रश्न न हो। – user1251007

उत्तर

1

लिखना चाहिए https://github.com/lxml/lxml/pull/122/files से:।

"python3 में, urlopen पोस्ट डेटा के लिए एक बाइट धारा उम्मीद इस पैच ट्रांसमिशन से पहले यूटीएफ -8 में डेटा एन्कोड करता है। " में src/lxml/html/__ init__.py, परिवर्तन लाइन 918,

data = urlencode(values) 

data = urlencode(values).encode('utf-8') 
0

यह अजगर 3 है, तो आप

form.fields['your_name'] = b'Morphit' 

या

form.fields['your_name'] = 'Morphit'.encode('utf-8') 
+0

फ़ील्ड मान कोई फर्क नहीं पड़ता। 'Python3 -c 'आयात lxml.html का प्रयास करें; lxml.html.submit_form (lxml.html.fromstring ("" "

" "") .forms [0]) '' – jfs

0
def myopen_http(method, url, values): 
    if not url: 
     raise ValueError("cannot submit, no URL provided") 
    ## FIXME: should test that it's not a relative URL or something 
    try: 
     from urllib import urlencode, urlopen 
    except ImportError: # Python 3 
     from urllib.request import urlopen 
     from urllib.parse import urlencode 
    if method == 'GET': 
     if '?' in url: 
     url += '&' 
     else: 
     url += '?' 
     url += urlencode(values) 
     data = None 
    else: 
     data = urlencode(values).encode('utf-8') 

    return urlopen(url, data) 

result = lxml.html.parse(lxml.html.submit_form(form, open_http=myopen_http)) 
संबंधित मुद्दे