سؤال

ولقد كتبت هذا في محاولة لتسجيل الدخول إلى المنتدى (PHPBB3).

import urllib2, re
import urllib, re
logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
output = page.read()

ولكن عند تشغيل انها تأتي مع؛

Traceback (most recent call last):
  File "C:/Users/Mike/Documents/python/test urllib2", line 4, in <module>
    page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
TypeError: string indices must be integers

وأي أفكار لكيفية حل هذا؟

تحرير

وإضافة الفاصلة بين سلسلة والبيانات يعطي هذا الخطأ بدلا

Traceback (most recent call last):
  File "C:/Users/Mike/Documents/python/test urllib2", line 4, in <module>
    page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login",[logindata])
  File "C:\Python25\lib\urllib.py", line 84, in urlopen
    return opener.open(url, data)
  File "C:\Python25\lib\urllib.py", line 192, in open
    return getattr(self, name)(url, data)
  File "C:\Python25\lib\urllib.py", line 327, in open_http
    h.send(data)
  File "C:\Python25\lib\httplib.py", line 711, in send
    self.sock.sendall(str)
  File "<string>", line 1, in sendall
TypeError: sendall() argument 1 must be string or read-only buffer, not list

edit2

ولقد غيرت رمز من ما كان عليه ل؛

import urllib2, re
import urllib, re
logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
output = page.read()

وهذا لا رمي أي رسائل خطأ، انها مجرد يعطي 3 أسطر فارغة. هل هذا لأنني أحاول أن أقرأ من سجل في الصفحة التي يختفي بعد تسجيل الدخول. إذا كان الأمر كذلك كيف يمكنني الحصول عليه لعرض فهرس وهو ما يجب أن تظهر بعد ضرب سجل في.

هل كانت مفيدة؟

المحلول

وخطك

page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])

وهو غويا بيثون صالح. يفترض أن يعني لك

page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login", [logindata])

والتي لديها فاصلة تفصل بين الحجج. ومع ذلك، ما تريد في الواقع هو مجرد

page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)

ودون أن يحاول أن أرفق logindata في قائمة واستخدام إصدار urlopen أكثر ما يصل إلى تاريخ غير المكتبة urllib2.

نصائح أخرى

وماذا عن باستخدام فاصلة بين سلسلة، "http:..." والبيانات urlencoded، [logindata]؟

وينبغي أن لا يكون لديك سلسلة URL

"http://www.woarl.com/board/ucp.php?mode=login"[logindata]

ولكن

 "http://www.woarl.com/board/ucp.php?mode=login", logindata

وأعتقد، لأن [] هو لمجموعة وتتطلب عددا صحيحا. قد أكون على خطأ والسبب أنني لم تكن قد فعلت الكثير من بيثون.

إذا كنت تفعل نوع على logindata، يمكنك أن ترى أن ذلك هو سلسلة:

>>> import urllib
>>> logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
>>> type(logindata)
<type 'str'>

وضعه بين قوسين ([]) يضعه في سياق القائمة، وهي ليست على ما تريد.

وهذا من شأنه أن يكون أسهل مع رفيع المستوى "مكننة" وحدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top