You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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。

具体步骤:

  1. 先安装BeautifulSoup:
pip install beautifulsoup4
  1. 修改代码实现需求:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:06:29