Поиск полей ввода формы с помощью Mechanize, где метка поля содержит строку в списке строк? - PullRequest
2 голосов
/ 29 августа 2011

Теперь я понимаю, что означает ошибка, но мне любопытно, почему это не работает и если есть альтернатива, которая выполнит ту же задачу.Я передаю регулярные выражения при использовании Beautiful Soup и разочарован тем, что Mechanize не поддерживает (?) Ту же функциональность.input_names является диктом.

TypeError: control label must be string-like

# first - as a default - set form inputs by their labels
for k in variables:
    for word in input_names[k]:
        for control in br.form.find_control(label=re.compile(word)):
            br.form.set_value(variables[k], name=control.name)

Цель состоит в том, чтобы сопоставить любой ввод формы, чья метка содержит фразу, а не полностью совпадает.

Кроме того, любые советы по эффективности или красивому / элегантному кодуоценены;Я новичок в Python.

Обходной путь: (не проверено)

for tag in soup.findAll("label"):
    for k in variables:
        # try to find label in <label>X</label>. It will not be in for="X" 
        # because if it was, we'd find it below anyway.
            for word in input_names[k]:
                if word in  tag.contents.lower():
                    try:
                        br.form.find_control(name=tag['for'], kind="text").value = variables[k]
                    except:
                        print "failed to set value of input found by label."

1 Ответ

1 голос
/ 29 августа 2011

Предполагая, что br.form.find_control() не принимает регулярные выражения, нам нужно как-то решить это, например, вручную найти и сопоставить все элементы управления.В качестве альтернативы, используйте BS с регулярным выражением, чтобы сопоставить буквенный текст, а затем верните его обратно в mechanize.

...