### ch5-1
from tkinter import Tk # 從標準函式庫的 tkinter 套件匯入 Tk 類別
win = Tk() # 用 Tk() 類別來建立視窗物件 win
win.mainloop() # 用 win 的 mainloop() 方法來顯示視窗,並進入等待使用者操作的迴圈
### ch5-2
import requests # 匯入 requests 套件
from bs4 import BeautifulSoup # 從 bs4 套件匯入 BeautifulSoup 類別 (可用來解析網頁資料)
page = requests.get("http://www.flag.com.tw") # 用 regueset 的 get() 讀取網頁資料
soup = BeautifulSoup(page.text, "html.parser") # 建立 BeautifulSoup 類別的物件,叫做 soup,建立時有加入參數
print(soup.title) # 輸出 soup 的 title 屬性內容
### ch5-3:自定義 mdu.py 模組
### 產生一個新檔,名稱為 mdu.py
var = 1
def fun():
print('mdu.fun() 已執行')
print('mdu 模組已執行並匯入')
### 新增一個 .py 檔,需與 mdu.py 同一個資料夾裡,然後執行以下程式:
### 匯入 mdu 模組
>>> import mdu
>>> mdu.var
>>> mdu.fun()
### 匯入 mdu 模組的函式 fun()
>>> from mdu import fun
>>> fun()
### 匯入 mdu 模組的所有東西
>>> from mdu import *
>>> var
>>> fun()
### ch5-4:自定義 pkg 套件,先新增一個資料夾 pkg
### 在資料夾 pkg 產生一個新檔,名稱為 __init__.py
i_var = 2
def i_fun():
print('pkg.__init__.i_fun() 已執行')
print('pkg.__init__ 模組已執行並匯入')
### 在資料夾 pkg 產生一個新檔,名稱為 mdp.py
var = 3
def fun():
print('pkg.mdp.fun() 已執行')
print('pkg.mdp 模組已執行並匯入')
### 匯入 pkg (預設模組為 __init__.py)
>>> import pkg # 匯入 pkg\__init__.py
>>> pkg.i_var
>>> pkg.i_fun()
### 匯入 pkg 套件的 mdp 模組
>>> from pkg import mdp # 匯入 pkg\mdp.py
>>> mdp.var
>>> mdp.fun()
### 匯入 pkg 套件中,mdp 模組的函式 fun()
>>> from pkg.mdp import fun # 匯入 pkg\mdp.py 的函式 fun()
>>> fun()
### ch5-5 (5-0.py)
import requests # 匯入 requests 套件
r = requests.get('http://www.flag.com.tw') # 向旗標網站發出 GET 請求,並將回應物件儲存到 r
if r.status_code == 200: # 回應的狀態碼若為 200 表示 OK
print(r.text) # 將回應的文字 (網頁原始碼) 印出來
else:
print(r.status_code, r.reason) # 若發生錯誤 (狀態碼不是 200),則印出狀態碼及錯誤原因
### ch5-6 (5-1.py)
import requests
url = 'https://httpbin.org/get'
hd = {'user-key': '7ADGS9S'} # 標頭參數(以字典儲存)
pm = {'id': 1023, 'neme': 'joe'} # 網址參數(以字典儲存)
r = requests.get(url, headers = hd, params = pm) # 加入 headers 及 params 參數
print(r.text) # 將回應的文字印出來
### ch5-7 (5-2.py)
import requests
url = 'http://httpbin.org/post' # 使用測試服務網站, POST 方法網址要加 /post
r = requests.post(url, data = 'Hello') # 送出字串資料
print(r.text)
r = requests.post(url, data = {'id':'123', 'name':'Joe'})
print(r.text)
### ch5-8 (5-3.py)
import requests
r = requests.put('https://httpbin.org/put', data = {'key':'abc'})
print(r.text)
r = requests.patch('https://httpbin.org/patch', data = {'key':'xyz'})
print(r.text)
r = requests.delete('https://httpbin.org/delete')
print(r.text)
### ch5-9 (5-4.py)
page = """
旗標科技
產品類別
"""
from bs4 import BeautifulSoup
bs = BeautifulSoup(page, 'lxml')
### ch5-10 (續 5-4.py):以標籤做為 bs 物件的屬性來查詢資料
>>> print(bs.title)
>>> print(bs.a)
>>> print(bs.a.text)
>>> print(bs.a.get('href'))
>>> print(bs.a['href'])
### ch5-11 (續 5-4.py):使用 find() 方法
>>> print(bs.find('h4'))
>>> print(bs.find('h4', {'class': 'pk'}))
>>> print(bs.find('h4').text)
### ch5-12 (續 5-4.py):使用 find_all() 方法
>>> print(bs.find_all('h4'))
>>> print(bs.find_all('h4', {'class': 'pk'}))
>>> print(bs.find_all(['title', 'p']))
>>> print(bs.find_all(['title', 'p'])[1].text) # 傳回第 1 個 (由 0 算起) 符合標籤中的文字
### ch5-13 (續 5-4.py):使用 select() 方法
>>> print('h4:', bs.select('h4')) # 查詢所有 h4 標籤
>>> print('#book:', bs.select('#books')) # 查詢所有 id 為 'books' 的標籤
>>> print('.pk:', bs.select('.pk')) # 查詢所有 class 為 'pk' 的標籤
>>> print('h4.bk', bs.select('h4.bk')) # 查詢所有 class 為 'bk' 的 h4 標籤
### ch5-14 (續 5-4.py):使用 select() 方法,針對多層套疊的標籤
>>> print(bs.select('#main button .pk'))
>>> print(bs.select('#main button .pk')[1].text)
>>> print(bs.select('#footer a')[0]['href'])
### ch5-15:用 re 模組以「常規表達式」來搜尋字串
https://pythex.org
conda install selenium
https://sites.google.com/a/chromium.org/chromedriver/downloads
from selenium import webdriver # 匯入 selenium 的 webdriver
from time import sleep # 匯入內建 time 模組的 sleep() 函式
browser = webdriver.Chrome() # 建立 Chrome 瀏覽器物件
browser.get('http://www.flag.com.tw') # 開啟 Chrome 並連到 Google 網站
sleep(5)
browser.close()
### ch5-16 (5-5.py):用 re 模組以「常規表達式」來搜尋字串
import re # 使用前要先匯入 re 模組
print(re.match (r'pyt', 'python')) # pyt 由開頭即符合, 因此成功
print(re.match (r'yth', 'python')) # yth 與開頭不符合, 因此失敗
print(re.search(r'yth', 'python')) # seach( ) 不限開頭, 因此成功
### ch5-17 (5-6.py):用 re 模組以「常規表達式」來搜尋字串
import re
m = re.search(r'p[a-z]+e', 'apples')
print(m) # 輸出 <_sre.SRE_Match object; span=(1, 5), match='pple'>
print(m.group()) # 輸出 pple
print(m.start()) # 輸出 1
print(m.end()) # 輸出 5 注意!pple 的位置是 1~4
print(m.span()) # 輸出 (1, 5)
### ch5-18:sub():將找到的子字串置換為另一個字串
import re
print(re.sub(r"[0-9]", '#', "a1b23c456d"))
### ch5-19:用 compile() 來提升多次搜尋的效率
import re
ptn = re.compile(r'[0-9]+')
print(ptn.search('a1b23c456d').group())
print(ptn.findall('a1b23c456d'))
print(ptn.sub('#', 'a1b23c456d'))
### ch5-20:安裝 Selenium 套件與 WebDriver 程式
>>> conda install selenium
### ch5-21 (5-8.py):建立瀏覽器物件來操控 Chrome
from selenium import webdriver # 匯入 selenium 套件的 webdriver 子套件
from time import sleep
browser = webdriver.Chrome() # 用 webdriver 的 Chrome 類別建立瀏覽器物件
browser.get("http://www.flag.com.tw") # 開啟 Chrome,並連到旗標網站
sleep(5)
browser.close() # 關閉網頁 (目前分頁)
### ch5-22 (5-9.py)
from selenium import webdriver # 匯入 selenium 的 webdriver
from time import sleep # 匯入內建 time 模組的 sleep() 函式
browser = webdriver.Chrome() # 建立 Chrome 瀏覽器物件
browser.get('http://www.google.com') # 開啟 Chrome 並連到 Google 網站
print('標題:' + browser.title) # 輸出網頁標題
print('網址:' + browser.current_url) # 輸出網頁網址
print('內容:' + browser.page_source[0:50]) # 輸出網頁原始碼的前 50 個字
print('視窗:', browser.get_window_rect()) # 輸出視窗的位置及寬高
browser.save_screenshot('d:/scrcap.png') # 截取網頁畫面
sleep(3) # 暫停 3 秒
browser.set_window_rect(200, 100, 500, 250) # 改變視窗位置及大小
sleep(3)
browser.fullscreen_window() # 將視窗設為全螢幕
sleep(3)
browser.quit() # 關閉視窗結束驅動
### ch5-23 (5-10.py)
from selenium import webdriver # 匯入 selenium 的 webdriver
browser = webdriver.Chrome() # 建立 Chrome 瀏覽器物件
browser.get('http://www.google.com') # 開啟 Chrome 並連到旗標網站
e1 = browser.find_element_by_tag_name('head') # 尋找 head 標籤
print(e1.tag_name) # 輸出 head 確認已找到 (tag_name 屬性為標籤名稱, 詳見下表)
e2 = e1.find_element_by_tag_name('title') # 在 head 元素中尋找 title 標籤
print(e2.tag_name) # 輸出 tite 確認已找到
browser.quit() # 關閉視窗結束驅動
### ch5-24 (5-11.py)
from selenium import webdriver # 匯入 selenium 的 webdriver
opt = webdriver.ChromeOptions() # 建立選項物件
opt.add_experimental_option('prefs', # 在選項物件中加入「禁止顯示訊息框」的選項
{'profile.default_content_setting_values': {'notifications' : 2}})
browser = webdriver.Chrome(options = opt) # 以 options 指名參數來建立瀏覽器物件
browser.get('http://www.facebook.com') # 開啟 Chrome 並連到 fb 網站
browser.find_element_by_id('email').send_keys('您的帳號') # 輸入帳號
browser.find_element_by_id('pass').send_keys('您的密碼') # 輸入密碼
browser.find_element_by_id('loginbutton').click() # 按登入鈕
### ch5-25 (5-12.py)
from selenium import webdriver # 匯入 selenium 的 webdriver
from time import sleep # 匯入內建的 time 模組的 sleep() 函式
opt = webdriver.ChromeOptions() # 建立選項物件
opt.add_experimental_option('prefs', # 加入「禁止顯示訊息框」的選項
{'profile.default_content_setting_values': {'notifications' : 2}})
browser = webdriver.Chrome(options = opt) #以 options 參數來建立瀏覽器物件
browser.get('http://www.google.com') # 開啟 Chrome 並連到 Google 網站
browser.maximize_window() # 將視窗最大化以避免最右邊的登入鈕沒顯示出來
browser.find_element_by_id('gb_70').click() # 按登入鈕
sleep(3) # 暫停 3 秒,等待進入下一頁
browser.find_element_by_id('identifierId').send_keys('您的帳號') # 輸入帳號
browser.find_element_by_id('identifierNext').click() # 按繼續鈕
sleep(3) # 暫停 3 秒,等待進入下一頁
browser.find_element_by_name('password').send_keys('您的密碼') #輸入密碼
browser.find_element_by_id('passwordNext').click() # 按繼續鈕