2014-07-22 2 views
1

기계화를 사용하여 webform을 조작하는 작은 스크립트가 있습니다. 여기에 양식의 스크린 샷이다html 테이블에서 기계식으로 조작 할 라인 결정

capture image

코드 (하단의 전송 버튼없이 그것에 대해 걱정하지 마십시오..) :

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 # 컨트롤 (확인란)과 상관 관계가있는)이 가장 최근의 행인지 결정하고 해당 확인란을 선택한 상태로 양식을 제출하려면 어떻게해야합니까? 더 많은 파일이 전송되면 누적되며, 다시 전송할 필요가 없습니다. 가장 최근의 것.

정규식에 대해 조금 알고 있습니다. urllib2를 사용하여 html 페이지를 문자열로로드하고 현재 진행중인 'Ingress'전송에서 백분율을 가져올 수 있지만 올바른 컨트롤 (체크 박스)에 해당하는 가장 최근 전송을 결정하는 방법에 대해서는 약간 분실되어 있습니다.

+0

당신이 포함 할 수 있습니다 또는 예제 파일'avicapture.html'에 링크 하시겠습니까? 스크린 샷은 실제 구조가 어떻게 보이는지만을 암시합니다. – phihag

+0

물론입니다. [avicapture.html] (http://www.whatdoiknow.net/dump/avicapture.html) – oorahduc

+0

불완전한 덤프 인 것 같습니다. 하나의 경우,

열린 태그가 없습니다. – phihag

답변

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!" 
+0

당신은 천재입니다. – oorahduc