Python lxml中的POST方法表单与提交表单一起引发TypeError

Python lxml中的POST方法表单与提交表单一起引发TypeError,python,python-3.x,lxml,Python,Python 3.x,Lxml,我正在尝试使用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_n

我正在尝试使用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.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\u表单(表单)) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/usr/lib/python3.3/site packages/lxml/html/__init___;.py”,第887行,提交形式 返回open_http(form.method、url、值) 文件“/usr/lib/python3.3/site packages/lxml/html/_init__.py”,第907行,在open_http_urllib中 返回urlopen(url、数据) urlopen中的文件“/usr/lib/python3.3/urllib/request.py”,第160行 返回opener.open(url、数据、超时) 文件“/usr/lib/python3.3/urllib/request.py”,第471行,打开 req=甲基(req) 文件“/usr/lib/python3.3/urllib/request.py”,do_请求中的第1183行_ raise TypeError(msg) TypeError:POST数据应为字节或字节数。它不能是str类型。
我在网上的其他地方发现了确切的错误,但我没有看到像这样从lxml内部生成的错误。有人知道这是一个bug,还是预期的行为,以及如何解决它吗?

这是Python3,所以您应该编写

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

发件人:

“在python3中,urlopen需要一个字节流作为POST数据。此修补程序在传输之前以utf-8对数据进行编码。”在src/lxml/html/__init___;.py中,更改第918行

data = urlencode(values)


我也有同样的毛病。。它看起来确实像一个bug,因为它是str/unicode/bytes的内部管理。作为参考,Morphit向提交了一个bug,修复了补丁,甚至根据反馈改进了它。遗憾的是,拉请求仍在等待合并@Morphit:您可以在这里添加您提议的拉取请求作为答案。接受这个答案,这样就不再是一个未回答的问题。字段值无关紧要。尝试
python3-c'导入lxml.html;lxml.html.submit_表单(lxml.html.fromstring(“”)表单[0])”
data = urlencode(values)
data = urlencode(values).encode('utf-8')
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))