如何用Python Mechanize通过id和data-row实现表单自动提交?
问题
我想用Python的mechanize库实现表单自动提交,但这个库只能靠元素的name属性操作。我的需求是结合非唯一的id属性和取值在1到15之间的data-row属性来勾选复选框,试过twill库也遇到同样问题,不想用Selenium(希望脚本能后台运行)。
示例HTML片段:
<td data-group="0" class="select"> <label class="checkbox-label"> <input type="checkbox" id="00" data-row="1" data-column="0" data-group="0"> <span class="rate">%13</span> </label> <label class="checkbox-label"> <input type="checkbox" id="01" data-row="1" data-column="1" data-group="0"> <span class="rate">%13</span> </label> <label class="checkbox-label"> <input type="checkbox" id="02" data-row="1" data-column="2" data-group="0"> <span class="rate">%74</span> </label> </td> ... <td data-group="0" class="select"> <label class="checkbox-label"> <input type="checkbox" id="00" data-row="15" data-column="0" data-group="0"> <span class="rate">%13</span> </label> <label class="checkbox-label"> <input type="checkbox" id="01" data-row="15" data-column="1" data-group="0"> <span class="rate">%16</span> </label> <label class="checkbox-label"> <input type="checkbox" id="02" data-row="15" data-column="2" data-group="0"> <span class="rate">%71</span> </label> </td>
初始Python代码:
import mechanize br = mechanize.Browser() br.set_handle_robots(False) br.open('https://www.nesine.com/sportoto') br.select_form(nr=1)
解决方案
mechanize原生只认name属性,没法直接通过id、data-row这类属性定位元素,所以可以结合BeautifulSoup解析页面,找到目标复选框后手动构造表单提交数据,全程后台运行,不用Selenium。
具体步骤:
- 先安装BeautifulSoup:
pip install beautifulsoup4
- 修改代码实现需求:
import mechanize from bs4 import BeautifulSoup br = mechanize.Browser() br.set_handle_robots(False) br.open('https://www.nesine.com/sportoto') br.select_form(nr=1) # 获取页面HTML,用BeautifulSoup解析 page_html = br.response().read() soup = BeautifulSoup(page_html, 'html.parser') # 筛选出所有data-row在1-15之间的复选框 target_checkboxes = soup.find_all( 'input', attrs={ 'type': 'checkbox', 'data-row': lambda val: val and 1 <= int(val) <= 15 } ) # 注意:这里需要先确认表单提交时的参数名,建议用浏览器开发者工具抓包看实际请求 # 假设提交时参数名为'checkbox',值是复选框的id for cb in target_checkboxes: cb_id = cb.get('id') # 给mechanize表单添加对应的控件 br.form.new_control('checkbox', 'checkbox', {'value': cb_id}) br.form.fixup() # 勾选该复选框 br.form.set_all_readonly(False) br.form['checkbox'].append(cb_id) # 提交表单并获取响应 submit_response = br.submit() print(submit_response.read())
重要提示:
- 代码里的
'checkbox'是假设的参数名,实际需要你抓包确认网站提交表单时用的参数名(比如可能是'ids'或者其他),替换成真实的参数名才能正常提交。 - 如果需要结合非唯一id筛选,在
attrs里添加'id': '目标id值'即可。
内容的提问来源于stack exchange,提问作者piseynir
相关产品推荐
相关产品推荐

