Python挑战游戏( PythonChallenge)闯关之路Level- 4
闯关过程
关口地址:http://www.pythonchallenge.com/pc/def/linkedlist.html
输入关卡地址发现, 提示信息要求将网址改为:http://www.pythonchallenge.com/pc/def/linkedlist.php
闯关程序:
#coding:utf-8
import urllib2
import HTMLParser
import re,time
from bs4 import BeautifulSoup as BS
def get_html_Pages(url):
try:
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0'}
#构建请求的request
request=urllib2.Request(url,headers=headers)
#利用urlopen获取页面代码
response=urllib2.urlopen(request)
#将页面转化为UTF-8编码格式
html=response.read().decode('utf-8')
html=HTMLParser.HTMLParser().unescape(html)#处理网页内容, 可以将一些html类型的符号如" 转换回双引号
return html
#捕捉异常,防止程序直接死掉
except urllib2.URLError,e:
print u"连接失败,错误原因",e.reason
return None
except urllib2.HTTPError,e:
print u"连接失败,错误原因:%s " % e.code
return None
def level4():
level4_url='http://www.pythonchallenge.com/pc/def/linkedlist.php'
html=get_html_Pages(level4_url)
tips_string_pattern=re.compile('<!--(.*?)-->',re.S)#定义匹配规则,获取网页中注释的内容
tips_string=re.search(tips_string_pattern,html).group(1).strip()
print u'提示信息是:%s ' % tips_string
#获取图片网址
bs_obj_level4=BS(html,'lxml')
photo_url= bs_obj_level4.find('a').get('href')
new_url_1= level4_url.replace(level4_url.split('/')[-1],photo_url)
new_url_2 = new_url_1
for i in range(400):
print '%d , next url is %s ' % (i,new_url_2)
next_html=get_html_Pages(new_url_2)
print next_html
if 'Divide' in next_html:
print 'it is Divide,need do again '
new_url_2= new_url_1.split('=')[0] + '=' + str(int(new_url_2.split('=')[1])/2)
print 'in Divide new url is %s' % new_url_2
else:
#通过正则表达式得到数字
str_num_pattern=re.compile(r'next nothing is (\d+)',re.S)
str3=re.findall(str_num_pattern,next_html)
#对数字长度进行判断,可以在最后跳出循环
if str3 ==[] :
print 'next lexvel'
break;
print str3[0]
new_url_2= new_url_1.split('=')[0] + '=' + str(str3[len(str3)-1])
if i%20 ==0:
time.sleep(2)
print 'finished'
level4()
下一关网址 :
66831
peak.html
http://www.pythonchallenge.com/pc/def/peak.html
总结:
本章关卡和黑板客第一关很相似: 都是需要不停获得新的页面, 不停的将页面内容中的数字提取出来,然后组装新的url, 如此重复
不同的是,本节关卡, 中间多了两个小意外,
一次是: 跑着跑着, 会要求将上一次的地址尾数,除以2,得到新的数字,再次继续
第二次是, 页面上出现了两个数字, 因此,这就需要对匹配规则做出一点点限制, 不能使用之匹配数字的正则表达式。