第三关
-
http://www.pythonchallenge.com/pc/def/ocr.html
提示信息:recognize the characters. maybe they are in the book, but MAYBE they are in the page source.
2.PNG
提示信息说的是信息可能在书中,也可能在网页源码中
这书上的文字我是看不清了,于是查看网页源码
发现如下
2-1.PNG
源码中有两段注释
第一段是说 在下面的乱码中查找稀有字符
第二段 就是一堆乱码
稀有字符是什么意思暂时不懂,不过反正那段乱码是有用的,先下载或者复制下来
python 代码实现
import requests, re
url = "http://www.pythonchallenge.com/pc/def/ocr.html"
res = requests.get(url=url)
# 获取网页源码
html = res.text
# 正则预编译
regex = re.compile(r"<!--.*?-->.*?<!--(.*?)-->", re.S)
# 匹配获取需要的乱码内容
text = regex.search(html).group(1)
下载之后看了半天这段乱码,没搞懂这个稀有到底是什么意思
后来灵机一动,稀有应该指的是数目,就是字符在这段乱码中的数目
接下来统计这段乱码中各个字符的数量,使用Counter
python代码实现
import requests, re
from collections import Counter # python统计常用的类
url = "http://www.pythonchallenge.com/pc/def/ocr.html"
res = requests.get(url=url)
# 获取网页源码
html = res.text
# 正则预编译
regex = re.compile(r"<!--.*?-->.*?<!--(.*?)-->", re.S)
# 匹配获取需要的乱码内容
text = regex.search(html).group(1)
# 构建counter
counter = Counter(text)
print(counter.most_common()) # 获取输出 most_common() 指定一个参数n,列出前n个元素,不指定参数,则列出所有
# 输出结果
# [(')', 6186), ('@', 6157), ('(', 6154), (']', 6152), ('#', 6115), ('_', 6112), ('[', 6108), ('}', 6105), ('%', 6104), ('!', 6079), ('+', 6066), ('$', 6046), ('{', 6046), ('&', 6043), ('*', 6034), ('^', 6030), ('\n', 1221), ('e', 1), ('q', 1), ('u', 1), ('a', 1), ('l', 1), ('i', 1), ('t', 1), ('y', 1)]
最少的字符依次是equality
将其替换url, 成功进入下一关
http://www.pythonchallenge.com/pc/def/equality.html
进入下一关
附录
from collections import Counter
# Counter目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。
# 初始化Counter的四种方式
c = Counter() # 初始化一个空白的counter
c = Counter(iterable) # 从一个可迭代对象创建 字符串列表 元祖等等
c = Counter({"a": 1, "b": 2}) # 从字典创建
c = Counter(a=1, b=2) # 键值对创建
# 访问元素
c["a"] # 与字典方式类似
# Counter的增加和减少
c = Counter("hello world!")
c["h"] # 输出1
# 增加计数器统计
c.update("hi")
c["h"] # 输出2
c.update(h=4)
c["h] # 输出6
# 减少计数器统计
c.c.subtract("hh")
c["h"] # 输出4
网友评论