2011-05-04 61 views
0

我想創建一個簡單的網絡機器人,它將訪問某個頁面,填寫和提交表單數據,然後打印提交時重定向到的頁面。然而,我的resp.read()調用不斷打印最初的表單提交頁面。Python網絡機器人(urllib)

這裏的頁面,我的代碼:

<html> 
<body> 
<P>Welcome <BR><P>Please answer the question <BR><P>98270+88340= ? 
<form name="loginform" method="post" action="vote.php"> 
    <input name="sum" type="text" id="sum" /> 
    <input type="submit" name="Submit" value="POST Answer"> 
    </form></body> 

import urllib 
import urllib2 
import lxml.html as lh 

#parse the operands 
url='hidden' 
parr=lh.parse(url).xpath('//p/text()') 
elem=parr[2] 
op1=int(elem[0:5]) 
op2=int(elem[6:11]) 
sum=op1+op2 
print sum 
sum=str(sum) 

#request values                 
values = { 
"sum": sum, 
"Submit": "POST Answer" 
} 
#encode for transmssion               
data = urllib.urlencode(values) 
request = urllib2.Request(url, data) 
resp=urllib2.urlopen(request) 
#receive response                
print resp.read() 
resp.close() 

我使用LXML爲HTML解析。它返回正確的總和。

+3

查看[機械化模塊](http://wwwsearch.sourceforge.net/mechanize/),它使這更容易。 – samplebias 2011-05-04 22:36:17

+0

感謝您的建議;我得到它與機械化 – Leif 2011-05-04 23:02:55

+0

你應該把這個:http://stackoverflow.com/revisions/801745a8-0bc0-4c9b-be05-595283e5be39/view-source並使其成爲你自己的問題的實際答案 - 不要編輯出你的問題,這對其他人來說很有用! – 2011-05-04 23:19:36

回答

0

問題已解決...對於任何想看到它的人來說,這都是一個解決方案。

import re 
import mechanize 
import lxml.html as lh 

url='hidden' 

parr=lh.parse(url).xpath('//p/text()') 
elem=parr[2] 
op1=int(elem[0:5]) 
op2=int(elem[6:11]) 
sum=op1+op2 
print sum 
sum=str(sum) 

br=mechanize.Browser() 
br.open(url) 

br.select_form(name="loginform") 
br["sum"]=sum 
resp=br.submit() 

br.select_form(name="poll") 
br["vote"]=["7"] 
resp2=br.submit() 

print resp2.read() 

基本上機器人打開URL,解析爲兩個操作數的頁面,然後繼續到下頁上的投票方式行使表決權之前輸入的總和到表單中。