我有一个小脚本,它使用mechanize来操作webform。这是表单的屏幕截图(底部没有提交按钮。不用担心。)
代码:
import re
import mechanize
bs = mechanize.Browser()
server = raw_input("IP to retry: ")
bs.open("http://"+server+"/avicapture.html")
assert bs.viewing_html()
bs.select_form(name="avistatus_form")
form = bs.form
bs.find_control("AVI_STATUS_ACTION").items[1].selected=True
bs.find_control("avistatuscheck0").items[0].selected=True
bs.find_control("avistatuscheck1").items[0].selected=True
bs.find_control("avistatuscheck2").items[0].selected=True
bs.find_control("avistatuscheck3").items[0].selected=True
bs.find_control("avistatuscheck4").items[0].selected=True
bs.find_control("avistatuscheck5").items[0].selected=True
print "Sending retry signal."
bs.submit()
print server+" Retried!"
实际上,它将检查所有六个方框并使用下拉选项(AVI_STATUS_ACTION)提交表格为[1]。
如何确定哪一行(与正确的avistatuscheck #control(复选框)相关)是最新的,并且只提交选中该复选框的表单?随着更多文件的传输,它们会累积,我不需要重新发送它们。只是最近的。
我对正则表达有所了解;足以使用urllib2将html页面加载到字符串中,并从当前的“正在进行”中获取百分比数量'转移,但我对如何确定与正确控件相对应的最近转移(复选框)有点失落。
答案 0 :(得分:1)
源代码以评论形式包含比实际HTML更好格式的数据:
</td>
<!--$FREETEXT|AVI_STATUS_START_TIME0||XXXXXXXXXXXXXXXXXXXXXXXXX$-->
<td>
2014/07/11 12:00:03
</td>
<!--$FREETEXT|AVI_STATUS_END_TIME0||XXXXXXXXXXXXXXXXXXXXXXXXX$-->
<td>
2014/07/11 14:00:00
</td>
<!--$FREETEXT|AVI_STATUS_FILE_SIZE0||XXXXXXXXXXXXX$-->
<td>
您可以使用正则表达式来解析它:
import re
import mechanize
bs = mechanize.Browser()
server = raw_input("IP to retry: ")
response = bs.open("http://" + server + "/avicapture.html")
assert bs.viewing_html()
bs.select_form(name="avistatus_form")
matches = re.findall(
r'(?s)<!--\$FREETEXT\|AVI_STATUS_END_TIME([0-9]+).*?<td>\s*([0-9/]+ [0-9:]+)\s*\n',
response.read())
latest_id, latest_time = max(matches, key=lambda m: m[1])
form = bs.form
bs.find_control("AVI_STATUS_ACTION").items[1].selected = True
bs.find_control("avistatuscheck" + latest_id).items[0].selected = True
print "Sending retry signal."
bs.submit()
print server+" Retried!"