如何使用mechanize通过ID而非表单名填充并提交无submit元素的表单
地理编码自动化提交表单解决方案
核心问题说明
目标网站的表单提交由find按钮的JS点击事件触发,没有标准<input type='submit'>元素,mechanize默认的提交逻辑无法识别提交控件,但我们可以跳过控件识别直接模拟表单提交动作。
方案1:mechanize 库实现
你可以直接填充表单字段后提交,不需要指定提交按钮,mechanize会自动沿用表单默认的提交配置:
import mechanize def get_lng_lat(address): br = mechanize.Browser() br.set_handle_robots(False) # 打开目标页面 br.open("https://www.latlong.net/convert-address-to-lat-long.html") # 选中页面第一个表单 br.select_form(nr=0) # 填充地址字段,字段name为addr br["addr"] = address # 直接提交,无需指定submit控件 resp = br.submit() html_content = resp.read().decode("utf-8") # 提取经纬度 lat = html_content.split('id="lat" value="')[1].split('"')[0] lng = html_content.split('id="lng" value="')[1].split('"')[0] return float(lat), float(lng) # 调用示例 print(get_lng_lat("上海市东方明珠"))
方案2:requests 库实现(更推荐)
目标网站提交逻辑非常简单,直接模拟POST请求即可,无需加载完整页面资源,执行效率更高:
import requests from bs4 import BeautifulSoup def get_lng_lat(address): url = "https://www.latlong.net/convert-address-to-lat-long.html" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } post_data = {"addr": address} resp = requests.post(url, headers=headers, data=post_data) soup = BeautifulSoup(resp.text, "lxml") lat = soup.select_one("#lat")["value"] lng = soup.select_one("#lng")["value"] return float(lat), float(lng) # 调用示例 print(get_lng_lat("上海市东方明珠"))
注意事项
- 频繁请求可能会触发网站的反爬限制,建议添加适当的请求间隔
- 经纬度提取逻辑可以根据页面结构调整,使用BeautifulSoup等HTML解析库稳定性更高
内容的提问来源于stack exchange,提问作者WhiteWood
相关产品推荐
相关产品推荐

