Механизм не может прочитать форму с SubmitControl, который отключен и не имеет значения - PullRequest
8 голосов
/ 12 февраля 2012

Я пытаюсь использовать mechanize (v0.2.5) для работы с формой на странице, в которой одним из элементов формы является отключенное изображение.Когда я пытаюсь выбрать форму, Mechanize поднимает AttributeError: control 'test' is disabled, где test - имя отключенного элемента управления.Например,

br = mechanize.Browser(factory=mechanize.RobustFactory())
br.open("http://whatever...")
br.select_form(nr=0)

Приводит к этой трассировке стека:

    br.select_form(nr=0)
  File "build\bdist.win32\egg\mechanize\_mechanize.py", line 499, in select_form
  File "build\bdist.win32\egg\mechanize\_html.py", line 544, in __getattr__
  File "build\bdist.win32\egg\mechanize\_html.py", line 557, in forms
  File "build\bdist.win32\egg\mechanize\_html.py", line 237, in forms
  File "build\bdist.win32\egg\mechanize\_form.py", line 844, in ParseResponseEx
  File "build\bdist.win32\egg\mechanize\_form.py", line 1017, in _ParseFileEx
  File "build\bdist.win32\egg\mechanize\_form.py", line 2735, in new_control
  File "build\bdist.win32\egg\mechanize\_form.py", line 2336, in __init__
  File "build\bdist.win32\egg\mechanize\_form.py", line 1221, in __setattr__
AttributeError: control 'test' is disabled

Изучая исходный код механизации, похоже, что эта ошибка всегда будет возникать при наличии любого элемента формы, которыйоценивается как mechanize.SubmitControl и не имеет предварительно определенного атрибута value.Например, следующая форма вызовет ту же ошибку:

<form action="http://whatever" method="POST">
    <input name="test" type="submit" disabled="disabled" />
</form>

Я не уверен, должно ли это считаться ошибкой, но в любом случае есть ли обходной путь?Например, есть ли способ изменить HTML-код целевой страницы, чтобы включить отключенные элементы управления, прежде чем я вызову br.select_form()?

РЕДАКТИРОВАТЬ

У меня естьпредставил исправление для исправления этой проблемы.

Ответы [ 2 ]

8 голосов
/ 03 марта 2013

К сожалению, прошло уже больше года, и вышестоящий механизатор все еще не объединил запрос на извлечение .

Тем временем вы можете использовать этот мартыш-патч, который я написал, чтобы обойти ошибку безнеобходимо вручную установить пропатченную версию.Надеемся, что эта ошибка будет устранена, когда (если) выйдет 0.2.6, поэтому патч применим только к версиям 0.2.5 и более ранним.

def monkeypatch_mechanize():
    """Work-around for a mechanize 0.2.5 bug. See: https://github.com/jjlee/mechanize/pull/58"""
    import mechanize
    if mechanize.__version__ < (0, 2, 6):
        from mechanize._form import SubmitControl, ScalarControl

        def __init__(self, type, name, attrs, index=None):
            ScalarControl.__init__(self, type, name, attrs, index)
            # IE5 defaults SUBMIT value to "Submit Query"; Firebird 0.6 leaves it
            # blank, Konqueror 3.1 defaults to "Submit".  HTML spec. doesn't seem
            # to define this.
            if self.value is None:
                if self.disabled:
                    self.disabled = False
                    self.value = ""
                    self.disabled = True
                else:
                    self.value = ""
            self.readonly = True

        SubmitControl.__init__ = __init__
0 голосов
/ 30 августа 2012

Это определенно ошибка, сообщать об этом в апстриме, делать патч, отправлять его в апстриме и, тем временем, использовать исправленную версию - это вполне верный способ справиться с этим. (Спасибо, что выбрали именно так.)

Как вы упомянули, другой подход заключается в том, чтобы обойти его путем предварительной обработки исходного HTML (который может быть полезен, если вы спешите или не можете / не хотите использовать исправленную версию по какой-то причине, но обратите внимание что обходные пути не помогают сообществу). Для постобработки можно использовать любой подходящий метод - от str.replace () до обработки на уровне DOM с BeautifulSoup или lxml .

...