scrapy问题并填写下拉菜单中的表单

时间:2014-08-09 13:30:58

标签: python scrapy

我需要用scrapy完成一个简单的表单,但我无法弄清楚如何填写并提交它。

以下是表单的HTML:

<form action="#" id="historicalQuoteDatePicker" class="ZEITRAUM" method="get">
    <fieldset> 
        <label for="dateStart">Startdatum:</label>
        <input type="text" name="dateStart" id="dateStart" value="" class="hasDatepicker">
        <img class="ui-datepicker-trigger" src="http://i.onvista.de/d.gif" alt="Klicken Sie hier um ein Datum auszuwählen" title="Klicken Sie hier um ein Datum auszuwählen"> 
        <label for="interval">Zeitraum:</label>
        <select name="interval" id="interval">
            <option value="M1">1 Monat</option>
            <option value="M3">3 Monate</option>
            <option value="M6">6 Monate</option>
            <option value="Y1" selected="selected">1 Jahr</option>
            <option value="Y3">3 Jahre</option>
            <option value="Y5">5 Jahre</option>
        </select> 
    </fieldset>
    <span class="button button-purple button-tiny"> 
        <input type="submit" value="Anzeigen"> 
    </span>
</form> 

我可以完成简单的搜索表单。然而,有了这个我尝试了一切,它仍然无法正常工作。我尝试使用clickdata参数,但它需要按钮的'name'属性,这里没有给出。

这是我到目前为止尝试使用的代码:

def history_popup(self, response):
    yield FormRequest.from_response(response,
          formxpath="//input[@id='dateStart']",
          formdata={"dateStart":"09.08.2013"},
          callback=self.history_miner) 

我知道这是不完整的,但我希望我在这里走在正确的轨道上。我的问题:如何点击按钮并从下拉菜单中选择其中一个选项?

非常感谢任何形式的帮助! 谢谢!

1 个答案:

答案 0 :(得分:3)

1)FormRequest单击第一个可单击元素:

  

默认情况下,策略是在任何看起来可点击的表单控件上自动模拟单击,例如a。

但是,可以通过clickdata选择要单击的元素,但它不需要name属性,任何属性都可以使用,包括type属性。在您的情况下,您可以这样做:

clickdata = { "type": "Submit" }

2)您可以按照设置输入值e.i的相同方式“选择”下拉菜单中的一个选项。 “select_name”:“option_text”。但请注意,即使该选项不存在,此方法也会将下拉值设置为option_text,即使该选项不存在。

formdata = { "interval" : "Jahr" }

3)最后,formxpath值必须指向一个表单元素,否则你将收到一个错误。 FormRequest的工作方式是找到一个表单,找到与formdata中的名称匹配的表单IN,并用formdata中的各自数据填充这些元素。我相信你的formxpath应该是:

formxpath="//form[@id='historicalQuoteDatePicker']"

现在一起:

FormRequest.from_response(
    response,
    formxpath="//form[@id='historicalQuoteDatePicker']",
    formdata={
        "dateStart":"09.08.2013",
        "interval" : "Jahr" },
    clickdata = { "type": "Submit" },
    callback=self.history_miner
    )

这对我来说最近有用,祝你好运!请让我知道这对你有没有用。 FormRequest的一个不太有用但足够的文档:http://doc.scrapy.org/en/0.24/topics/request-response.html#scrapy.http.FormRequest.from_response