2011-05-04 88 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,解析为两个操作数的页面,然后继续到下页上的投票方式行使表决权之前输入的总和到表单中。