# -*- 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次,最小匹配
'''