【问题标题】:Robobrowser and flask errorsRobobrowser 和烧瓶错误
【发布时间】:2015-07-16 04:49:35
【问题描述】:

我正在尝试为自己创建一个脚本,以便在一些分类网站上使用,并从 cl 开始,我正在使用 flask web 框架和 robobrowser,但进展并不顺利。

目标它将采用我的预设值并将它们放入该分类网站的字段中。这似乎不是一个困难的概念,但是在阅读了 5 个小时的在线不同代码和反复试验后,我记得最好的开发人员都在堆栈中......

我应该告诉您,我是 Python 新手,还有很多东西要学习,因此我们将不胜感激。

我得到的错误是: 断言 isinstance(form, 'str') TypeError: isinstance() arg 2 必须是类型或类型的元组

但我不知道如何解决这个问题并且完全迷失了。帮助!!! 提前致谢

# autosubmit to site

            from flask import Flask
            from robobrowser import RoboBrowser

            app = Flask(__name__)

            @app.route('/', methods = ['GET', 'POST'])
            class My_RoboBrowser(RoboBrowser):
                def __init__(self, auth=None, parser=None, headers=None, user_agent=None, history=True):
                    RoboBrowser.__init__(self, parser=None, user_agent=None, history=True)

                def Open(self, vURL, vVerify=True):
                    response = self.session.get(vURL, verify=vVerify)
                    self._update_state(response)

            browser = My_RoboBrowser(RoboBrowser, "html.parser");
            urlL = 'https://accounts.craigslist.org/login'

            browser.Open(urlL)

            form = browser.get_form(id='login')
            assert isinstance(form, 'str')
            form['username'] = 'username'
            form['password'] = 'password'
            browser.submit_form(form)

            urlQ = 'https://post.craigslist.org/k/qGDv7K4q5RGD0B5ZEBgXOQ/GLzgd?s=edit'
            browser.open(urlQ)

            #Question_Tag = browser.find_all(class_="not_answered")[0]

            #ID = Question_Tag.get('data-qid')

            #Get the form to fill out
            Form = browser.get_form(id='formpost')
            Form['PostingTitle'].value = 'Create this advertise ment in py'
            Form['Postal_code'].value = ['10543']
            Form['PostingBody'].value = 'TOGETHER WE INNOVATE Stress free communication with developers that are in the United States. We pride ourselves in bringing your web and app ideas to life and keeping your data secured'
            browser.submit_form(Form)


            if __name__ == "__main__":
                app.run()

【问题讨论】:

  • isinstance(form, str) 看到了吗? str 不是 'str'
  • @mehtunguh 我删除了这些引号,但仍然收到错误 'assert isinstance(form, str) AssertionError '
  • AssertionError 在这种情况下意味着对象不是str 的实例。您的代码是正确的,但您的表单不是字符串。看起来可能是dict

标签: python forms beautifulsoup robobrowser


【解决方案1】:
如果第一个参数是第二个参数的实例(或子类),

isinstance 返回 true,否则返回 false。在您的断言中,表单变量的类型为 robobrowser.forms.form.Form。您可以通过以下代码看到这一点:

print(type(form)) # should print <class 'robobrowser.forms.form.Form'>

如果您更新第二个参数以指示此 robobrowser Form 类,您的特定断言将通过:

# Add the following to your imports
import robobrowser

# ... existing code below imports

# The following should be true if form is valid
assert isinstance(form, robobrowser.forms.form.Form)

您也可以直接导入 Form 类,但您必须相应地更新断言:

from robobrowser.forms.form import Form

# ... existing code below imports

assert isinstance(form, Form)

编辑:

以下是从该页面正确获取表单的代码。没有 ID 为“登录”的表单,但您可以通过使用其操作或抓取页面上的第一个表单来选择它。

# ... previous code ...

form = browser.get_form(action='https://accounts.craigslist.org/login')
# you can also use: form = browser.get_form(0)

# It looks like you aren't selecting the fields by their proper names either.
form['inputEmailHandle'] = 'fill in username here'
form['inputPassword'] = 'fill in password here'
browser.submit_form(form)

看看上面添加的代码是否有帮助。

【讨论】:

  • 感谢我按照您上面所说的所做的回复,但是现在我收到此错误form['username'] = 'user' TypeError: 'NoneType' object does not support item assignment
  • 您似乎没有在该页面上正确选择表单。该页面上的所有表单都没有 id 为“login”。您还可以通过其操作而不是 id 来选择表单。尝试使用 form = browser.get_form(action='accounts.craigslist.org/login') 甚至 form = browser.get_form(0)。我将在上面编辑我的答案。
  • 非常感谢您的帮助。所以我照你说的做了,改变了动作链接,以及输入,我不知道我是怎么做错的。所以它似乎正在让我登录,但我不知道,因为没有弹出任何内容。我以为它会弹出链接,登录而不是带我到发布 URL,但它甚至不是 Python 可能的吗?
  • 现在我收到此错误:` Traceback(最近一次调用最后一次):文件“C:/Users/learning/PycharmProjects/Mobile-SE/sas.py”,第 38 行,在 form['PostingTitle'].value = '创建您梦想中的 Web、移动或桌面应用程序' 文件“C:\Python34\lib\site-packages\robobrowser\forms\form.py”,第 213 行,在 getitem return self.fields[item] 文件“C:\Python34\lib\site-packages\werkzeug\datastructures.py”,第 717 行,在 getitem 中引发异常。BadRequestKeyError(key) werkzeug.exceptions.BadRequestKeyError: 400: 错误请求`
  • 我检查了 ID 和 URL 是否正确 Traceback(最近一次调用最后一次):文件“C:/Users/learning/PycharmProjects/Mobile-SE/sas.py”,第 38 行,在 form['PostingTitle'].value = '创建您梦想中的 Web、移动或桌面应用程序' 文件“C:\Python34\lib\site-packages\robobrowser\forms\form.py”,第 213 行,在 _getitem_ return self.fields[item] File "C:\Python34\lib\site-packages\werkzeug\datastructures.py", line 717, in _getitem_ raise exceptions.BadRequestKeyError (key) werkzeug.exceptions.BadRequestKeyError: 400: Bad Request
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2013-08-19
  • 2011-04-10
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多