Python挑战游戏( PythonChallenge)闯关之路Level- 1

闯关过程

关卡入口地址: http://www.pythonchallenge.com/pc/def/map.html

打开页面是这样的:



在图中的你内容,可以看到

  • K->M
  • O->Q
  • E->G
直观上感受是,字符串对应解析
也就是说,26个英文字符依次和图片下面的那一串一一对应,找出对应的内容,而且是后面第二个, 比如 开头字母'g'  对应的应该是 'i'
思路分析:
1.获取网页内容,通过网页内容得到将要翻译的那段文字(当然也可以直接复制过去)
2.定义翻译规则
3.得到翻译之后的结果

PS: 因为这里翻译之后,根据提示,还是需要再次翻译一下网址,因此最后再次将网址翻译一下,得到最后下一关网址。


程序:

#coding:utf-8

import urllib2
import HTMLParser
import re
from string import maketrans,translate,lowercase
def level1():
		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 translate_string(trans_string):
			test_string='cdefghijklmnopqrstuvwxyzab'
			test_string1='abcdefghijklmnopqrstuvwxyz'
			test_table={}
			#将一个list转换为字典的方法,字典格式为{list元素:list索引值}
			for i in test_string1:
				test_table[i]=test_string1.index(i)
		
			tmp_final_string=''
			for a in trans_string:
				if a in test_string1:
					tmp_final_string +=test_string[test_table[a]]
				else:
					tmp_final_string+=a
			print u'翻译转换出来的语句是:'+tmp_final_string
			return 	tmp_final_string
			
		leve2_url='http://www.pythonchallenge.com/pc/def/map.html'
		html=get_html_Pages(leve2_url)#获取网页内容


		target_string_pattern=re.compile('<font color="#f000f0">(.*?)</tr>',re.S)#定义匹配字符串规则
		target_string=re.search(target_string_pattern,html).group(1).strip()#得到网页上的那一行字符串
		print u'网页上提示的字符串序列是:'+target_string
		translate_string(target_string)
		#至此,内容已经翻译完毕,但是根据提示,需要对网址重新翻译
		next_level_translate_str=leve2_url.split('/')[-1].split('.')[0]
		print u'要被转换的网址内容是:'+next_level_translate_str
		next_level_url=leve2_url.replace(next_level_translate_str,translate_string(next_level_translate_str))
		print u'下一关网址是:'+next_level_url
		
level1()

运行结果

网页上提示的字符串序列是:g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.
翻译转换出来的语句是:i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.
要被转换的网址内容是:map
翻译转换出来的语句是:ocr
下一关网址是:http://www.pythonchallenge.com/pc/def/ocr.html

函数maketrans()

string.maketrans() 其实是和string.translate()一起使用比较好

string.maketrans() 是定义翻译规则, string.translate()则是按照翻译规则对字符串进行翻译

从帮助文档里面查看maketrans()的用法

maketrans(...)
    maketrans(frm, to) -> string
    
    Return a translation table (a string of 256 bytes long)
    suitable for use in string.translate.  The strings frm and to
    must be of the same length.

即这个函数有两个 参数, 都是字符串,而且得一样长,它就是定义翻译规则的, 有点类似字典 从帮助文档里面查看 translate() 的用法
translate(s, table, deletions='')
    translate(s,table [,deletions]) -> string
    
    Return a copy of the string s, where all characters occurring
    in the optional argument deletions are removed, and the
    remaining characters have been mapped through the given
    translation table, which must be a string of length 256.  The
    deletions argument is not allowed for Unicode strings.
  1. s 是要被翻译的字符串
  2. table  是翻译规则
  3. [deletion] 是可选参数, 如果它定义了, 就从参数s中先删除 [deletion]里面的内容,然后在做翻译
最后返回的是翻译之后的内容 例子:
#coding:utf-8
import string    
    
s = 'asked--deksa'    
    
# 参数from和to的长度必须一致    
table = string.maketrans('', '')   #这样写就把所有的str,即ASCII码包含了
#print table
print s.translate(table)   # 输出 asked--deksa  
  
table = string.maketrans('ae', '12')  #从新定义翻译规则,a->1, e->2
print s.translate(table)   # 输出 1sk2d--d2ks1  
  
# 将先删除'sk',然后再转换  
print s.translate(table, 'sk')    # 输出 12d--d21 

改版程序:

#coding:utf-8
from string import  maketrans,translate,lowercase
 
text="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
print lowercase
target_str=""
table= maketrans(lowercase,lowercase[2:]+lowercase[:2])
for i in text:
	if i in lowercase:
		target_str += translate(i,table)
	else:
		target_str +=i
print target_str
print translate('map',table)


翻译规则还可以这样写:

#coding:utf-8

from string import lowercase, punctuation  
#punctuation 就是那些符号
print punctuation
text = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. "
这也就等于新的翻译规则了
map_str = dict(zip(lowercase+punctuation+' ', lowercase[2:]+lowercase[:2]+punctuation+' '))  #这里需要将空格再加上
trans_text = ''  
for i in text: 
	trans_text += map_str[i]  
print trans_text

list转换为字典

将list元素与其索引值组成新的字典:

#coding:utf-8
from string import  lowercase
    
lower_str_dict={}
for i in lowercase:
	lower_str_dict[i]=lowercase.index(i)
print lower_str_dict
输出:

{'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'm': 12, 'l': 11, 'o': 14, 'n': 13, 'q': 16, 'p': 15
, 's': 18, 'r': 17, 'u': 20, 't': 19, 'w': 22, 'v': 21, 'y': 24, 'x': 23, 'z': 25}

还有一种方法

alph_map=dict(  zip(lowercase, [i for i in range(len(lowercase) )  ])  )
print alph_map






posted @ 2017-05-12 11:03  枫奇丶宛南  阅读(51)  评论(0编辑  收藏  举报