使用scrapy填写下拉菜单表单时遇到问题

3 投票
1 回答
3044 浏览
提问于 2025-04-18 16:40

我需要用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 个回答

4

1) FormRequest会自动点击第一个可以点击的元素:

这个规则是默认情况下,FormRequest会自动模拟点击任何看起来可以点击的表单控件,比如按钮。

不过,你可以通过clickdata选择要点击的元素,但这个元素不一定需要有名字属性,任何属性都可以用,包括类型属性。在你的情况下,你可以这样做:

clickdata = { "type": "Submit" }

2) 你可以用和设置输入框值一样的方法来“选择”下拉菜单中的一个选项,也就是用“select_name”: “option_text”。不过要注意,这种方法会把下拉菜单的值设置为你输入的option_text,即使这个选项并不存在。

formdata = { "interval" : "Jahr" }

3) 最后,formxpath的值必须指向一个表单元素,否则你会遇到错误。FormRequest的工作方式是,它会找到一个表单,然后在这个表单中找到与formdata中名字匹配的元素,并用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

撰写回答