# -*- coding: utf-8 -*-
www.icourse163.org/learn/BIT-1001870001
"""
Created on Thu Dec 21 19:38:18 2017
@author: ququxi
"""
本文是我看MOOC公开课上课,跟随老师记下的CODE代码!我希望我学习Python 这件事情能够坚持下来,不要去做一些没有意义的事情!总是在学习是好事,虽然我快要毕业了……我希望我自己今后的人生,一直都在学校里……并不是说我把自己装在学校里,我希望我自己一直在学习!这只是一片前言。
import requests
import bs4
from bs4 import BeautifulSoup
def getHTMLText(url):
try:
r = requests.get(url,timeout = 30)
r.raise_for_status()
r.encode = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist,html):
soup = BeautifulSoup(html,'html.parser')
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUnivList(ulist,num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
print('Suc' + str(num))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo, 20) # 20 univs
main()
'''
Re库主要功能函数
**re.search(pattern,string,flags = 0)
在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
pattern:正则表达式的字符串或原生字符串表示
string:带匹配的字符串
flags:正则表达式的控制标记
re.I(re.IGNORECASE) 表示忽略正则表达式的大小写
re.M(re.MULTILINE)表示正则表达式中的^操作符能够将给定的字符串的每行当做匹配开始
re.S(re.DOTALL) 表示正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符
**re.match(pattern,string,flags = 0)
**re.findall(pattern,string,flags = 0)
搜索字符串,以列表类型返回全部能匹配的子串
** re.split(pattern,string,maxsplit = 0,flags = 0)
maxsplit 最大分割数,剩余部分作为最后一个元素输出
** re.finditer(pattern,string,flags = 0)
搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
** re.sub(pattern,repl,string,count = 0,flags = 0)
在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
repl 替换 匹配字符串的字符串
count 匹配的最大替换次数
'''
import re
match = re.search(r'[1-9]\d{5}','BIT 100081')
if match:
print(match.group(0))
match = re.match(r'[1-9]\d{5}','100081 BIT')
if match:
match.group(0)
ls = re.findall(r'[1-9]\d{5}','BIT100081 BIT100082')
print(ls)
re.split(r'[1-9]\d{5}','BIT100081 BIT100082')
re.split(r'[1-9]\d{5}','BIT100081 BIT100082',maxsplit = 1)
for m in re.finditer(r'[1-9]\d{5}','BIT100081 BIT100082'):
if m:
print(m.group(0))
re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 BIT100082')
'''上述是函数式用法:一次性操作
Re库的另一种等价用法,是面向对象用法:编译后的多次操作
'''
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081')
'''
regx = re.compile(pattern,flags = 0)
将正则表达式的字符串形式编译为正则表达式对象
pattern 正则表达式的字符串或原生字符串表示
flags:正则表达式的控制标记
regx.search()
regx.match()
regx.findall()
regx.split()
regx.finditer()
regx.sub()
'''
rst.string #待匹配的文本
rst.re #匹配时使用的pattern对象(正则表达式)
rst.pos #正则表达式搜索文本的开始位置
rst.endpos #正则表达式搜索文本的结束位置
rst.group(0) #获得匹配后的字符串
rst.start() #匹配字符串在原始字符串的开始位置
rst.end() #匹配字符串在原始字符串的结束位置
rst.span() #返回(.start(),.end())
import re
regex = re.compile(r'[1-9]\d{5}')
m = regex.search('BIT100081 TSU100084')
m.string
m.re
m.pos
m.endpos
m.group(0)
m.group(1) #?
m.start()
m.span()
match = re.search(r'PY.*N','PYANBNCNDN')
match.group(0)
match = re.search(r'PY.*?N','PYANBNCNDN')
match.group(0)
# 最小匹配操作符
'''
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次,最小匹配
'''