urllib2 работает по-разному между окнами и * nix платформой? - PullRequest
0 голосов
/ 02 января 2011

Этот простой скрипт выполняет действие автоматического входа в систему.Он может работать на моем компьютере с Linux (Python 2.7) и ноутбуке (Mac OSX Python2.5), но я сталкиваюсь с проблемами в Windows XP (оба Python 2.6 / 2.7)

Traceback (most recent call last):
  File "E:\workspace\python\login_baidu.py", line 22, in <module>
    h=auto_login_hi(url,name,password)
  File "E:\workspace\python\login_baidu.py", line 12, in auto_login_hi
    opener=urllib2.build_opener(request,cj)
  File "C:\Python27\lib\urllib2.py", line 477, in build_opener
    opener.add_handler(h)
  File "C:\Python27\lib\urllib2.py", line 311, in add_handler
    type(handler))
TypeError: expected BaseHandler instance, got <type 'instance'>

Мой скрипт:

import urllib,urllib2,httplib,cookielib
def auto_login_hi(url,name,pwd):
    url_hi="http://passport.baidu.com/?login"
    cookie=cookielib.CookieJar()
    cj=urllib2.HTTPCookieProcessor(cookie)
    postdata=urllib.urlencode({'username':name,'password':pwd})
    request=urllib2.Request(url_hi,postdata)
    opener=urllib2.build_opener(request,cj)
    f=opener.open(request)
    print f
    hi_html=opener.open(url)
    return hi_html
if __name__=='__main__':
    name='myusername'
    password='mypasswd'
    url='http://hi.baidu.com/leemzoon'
    h=auto_login_hi(url,name,password)
    print h.read()

Ответы [ 2 ]

2 голосов
/ 02 января 2011

Это не проблема Nix против Windows ... ваш код не работает на обеих платформах:)

эта строка неверна:

opener=urllib2.build_opener(request,cj)

попробуйте вместо этого:

opener = urllib2.build_opener(cj)

вы неправильно вызываете build_opener ().см. также документы по Python .

, у вас есть дополнительный импорт для httplib, который вам не нужен

Однако ответ REAL : используйте mechanize для подобных вещей.Это гораздо проще, чем работать с urllib2 (автоматически обрабатывает куки).

0 голосов
/ 02 января 2011

Почему вы смешиваете urlib и urlib2

postdata=urllib.urlencode({'username':name,'password':pwd})
request=urllib2.Request(url_hi,postdata)
...