Scrapy能否基于ID提交输入?内网页面搜索表单提交问题
嘿,我看你在Scrapy提交搜索表单这儿遇到麻烦了,咱们来拆解下问题所在,再给你整出靠谱的解决方案~
首先,你两种尝试的核心问题都是没摸透scrapy.FormRequest.from_response()的正确用法,还有没找准表单提交时真正需要的参数键名。咱们一步步来修正:
问题拆解
from_response()的参数错误:你在方法1里把Selector定位到的元素传给了from_response(),但这个方法的第一个参数必须是response对象,不是Selector结果;方法2里用BeautifulSoup找到了输入框,但同样没围绕表单本身来处理——表单提交是依托<form>标签的,不是单独的输入框。- formdata的键名错误:你写的
{'Item': ...}是自定义的键,但浏览器提交表单时,是用输入框的name属性作为参数键的,不是id(也就是你说的searchBox),这大概率是提交失败的关键原因。
修正后的可行方案
方案1:纯Scrapy实现(推荐)
直接用response生成FormRequest,通过formxpath精准定位到包含searchBox的表单,同时确保formdata的键是输入框的name属性值(你可以查看页面源码,找到searchBox对应的<input>标签里的name值,比如假设是product_query):
def parse(self, response): # 提交搜索表单 return scrapy.FormRequest.from_response( response, # 定位包含id为searchBox的输入框的表单 formxpath="//form[.//input[@id='searchBox']]", # 这里的键替换成你实际查到的searchBox的name属性值 formdata={'product_query': 'Whirlpool Washing Machine'}, # 指定提交后处理搜索结果的回调函数 callback=self.parse_search_results ) # 新增处理搜索结果的回调函数 def parse_search_results(self, response): # 在这里解析搜索结果页面的内容,比如提取产品信息 pass
方案2:结合BeautifulSoup获取name属性
如果你想用BeautifulSoup辅助确认输入框的name属性(避免手动查源码出错),可以这么写:
from bs4 import BeautifulSoup def parse(self, response): soup = BeautifulSoup(response.text, 'html.parser') search_input = soup.find("input", id="searchBox") # 获取输入框的name属性,这是表单提交的关键参数键 input_name = search_input.get('name') if not input_name: raise ValueError("搜索输入框没有name属性,无法正常提交表单!") return scrapy.FormRequest.from_response( response, formxpath="//form[.//input[@id='searchBox']]", formdata={input_name: 'Whirlpool Washing Machine'}, callback=self.parse_search_results ) def parse_search_results(self, response): # 解析搜索结果逻辑 pass
额外注意点
- 确保页面里确实存在包含
searchBox的<form>标签,如果是JS动态提交的表单,那可能需要用scrapy.Request直接模拟POST请求,但内网页面一般都是普通表单,这个概率不大。 - 如果页面有多个表单,一定要用
formxpath或formid指定正确的表单,避免Scrapy选错表单导致提交失败。 - 一定要核对
formdata的键和输入框的name属性完全一致,这是最容易踩的坑!
内容的提问来源于stack exchange,提问作者Ninja2k
相关产品推荐
相关产品推荐

