使用Mechanize查找表单输入字段,其中字段的标签包含字符串列表中的字符串?

时间:2011-08-28 21:39:26

标签: python mechanize

现在我明白错误意味着什么,但我很好奇为什么这不起作用,如果有一个替代可用,它将完成相同的任务。我在使用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 个答案:

答案 0 :(得分:1)

假设br.form.find_control()不接受正则表达式,我们需要以某种方式解决它,例如通过手动查找和匹配所有控件。或者,使用带有正则表达式的BS与文字文本进行匹配,然后将其反馈给mechanize