稍微查了一下,使用 pip (或 pip3) 安裝 Python 套件時遇到 SSL CERTIFICATE_VERIFY_FAILED 錯誤可能的原因有很多,錯誤的狀態也有很多種,不過總體來看就是 SSL 的認證問題。如果在不嘗試解決認證問題之下,還可以透過以下指令參數忽略 SSL 認證直接安裝套件,目前試過是成功的。 ▍ 安裝套件的 pip 指令: ▍ 加入信任參數後的 pip 指令: 透過升級 pip 解決此問題 在 pip 10.0 之後可以透過指令升級 pip 來解決此問題,指令如下。 ▍ 升級 pip 的指令: Reference pip install fails with “connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)” | stack overflow Copyright announcement:Photo by Markus Spiske on...
Python / 如何移除字串中的特殊字元 使用 Unicode 編碼判斷保留中(日韓)、英文及數字字元
在做文字資料的清理時,最頭痛就是內含有特殊的字元,諸如一些標點符號 (如”^*/$#)、特殊符號 (如空白、TAB) 甚至,系統控制符號 (如 \n 換行字元、\b 退位字元) 或尚未被定義的編碼。如果是在全英文的環境,要清理字元還算簡單,只需利用 ASCII Code 判斷字元是不是英文或數字即可。最直覺的辦法就是利用 replace() 這個函數以窮舉法去將目標字元移除,例如欲移除字串中的空白、TAB和換行字元可以用下列方式移除: (由於接下來稍為對編碼及語法做簡單的說明,若已熟悉編碼或Python語法可以跳到最後直接參考範例程式) 利用字元編碼清除特殊字元 Python 內建就可以利用 ord() 函數取得字元的實際編碼,反過來也可以利用 chr() 函數將編碼重新轉換成字元。 ▍ 利用 ord() 函數取得字元編碼 同樣得,如果是在英文環境那還算單純,由於 ASCII Code 其實就是對應 0 ~ 255 的數字,例如換行字元 (\n) 等同於 10、TAB 字元等同於 9。所以若只希望保留大小寫英文字元及數字,可以利用 ord() 函數取得字元的編碼,再判斷該字元應該被保留或移除。大寫英文字母 (A-Z) 的編碼分別對應 65~90、小寫英文字母 (a-z) 則為 97~122,而數字 (0-9) 的編碼則是 48~57。清除字元的範例如下,最終 string 的結果會是 'teststring': 當然,也可以把上面的程式改成函數的方式重複使用:...
Python / 如何更新pip3
更新pip3: 更新pip: Copyright announcement:the featured image: Photo by Brett Jordan on Unsplash
Python / 檔案目錄處理 (windows system)
目錄 取得程式執行目錄 (current directory) 取得檔案大小 (Filesize) 確認檔案或目錄是否存在 刪除目錄下所有檔案 ▍取得程式執行目錄 (current working directory) ▍取得檔案大小 (Fileszie) 取得檔案大小的方法有三種,回傳的結果是位元組 (bytes) 使用 os.path.getsize(path) 使用 os.stat(path).st_size 使用 Path(path).stat().st_size (Python 3.4+) Reference Getting file size in Python? | stack overflow ▍確認檔案或目錄是否存在 在 os 套件中有三種相關的方法可以確認檔案或目錄是否存在: os.path.exists() 檢查檔案目錄是否存在 os.path.isfile() 確認路徑是否為檔案 os.path.isdir() 確認路徑是否為路徑 另外,在 Python 3.4 以上的版本可以使用 pathlibPath 套件: Reference Python Check If File...
Python / 使用 Selenium 撰寫網路爬蟲程式 (chromedriver)
想要用 Python 實作網路爬蟲程式的方法有兩種:使用 requests 套件或 selenium 套件。兩個套件的差異在於 requests 套件是使用最基礎的 GET 和 POST 方法和 server 溝通,好處在於它的速度快、作法單純,壞處是必須處裡來自於網站的一切資料傳輸動作、Cookies Handling、甚至更複雜的 JS 渲染、網頁程式互動等複雜的動作。如果要爬的目標網站內容比較單純,或甚至可以透過 API 取的資料,那可以考慮使用 requests 套件。不過現在的網站設計越來越複雜,本篇使用的 selenium 套件則是透過控制瀏覽器 (本篇使用 chromedriver),讓瀏覽器為我們處裡上面提到的複雜動作,例如登入帳號之後的 cookies handling、表單填寫並送出 POST request 或是 JS 渲染後的網站動作,讓我們模擬實際操作網站的方式進行網站爬蟲。本篇目前不是完整的爬蟲程式教學,只是筆記一些關於使用 Selenium 套件撰寫爬蟲程式的方法。 目錄 如何取得 HTML 的 attribute (how to get attribute of element) 實作捲動畫面 (Scrolling) ▍如何取得 HTML 的 attribute (how to...
Python / 如何在建立 SQLite 資料庫並在 python 中執行 SQL Script
SQLite 雖然是一個資料庫,但它並非是一個完整的資料庫伺服器,它是以 C 語言為基礎並根據 SQL 標準開發出來的小型資料庫檔案格式,是一個開放原始碼的語言。SQLite 現在幾乎已經內建在許多跨平台的裝置上,而 sqlite3 是 Python 內建的套件,可以用以存取、執行 SQLite資料庫檔案。 ▍安裝 DB Browser ▍在 Python 上連線 SQLite 資料庫並執行 SQL Script sqlite3 是 Python 的內建套件,可以直接 import 取用。使用時先以 connect() 建立資料庫連線,並建立 cursor() 物件以呼叫 execute() 執行 SQL Script。最終記得 commit() 儲存上面執行的任何修改,並以 close() 關閉資料庫連線。 ▍讀取 SELECT 結果 使用 execute() 執行 SELECT 語法會以 tuple 串列的格式回傳資料 在官方的文件中的範例: ▍建立 temp table...
SQLite / 語法筆記
目錄 如何在 SQLite 實現 Truncate Table SQLite 的時間與日期函數 取得當下時間(在地時區) 建立 temp table ▍如何在 SQLite 實現 Truncate Table TRUNCATE 指令在 SQL Server 中是清除整張 table 的所有 records,但不會刪除整張表單也不會移除 table schema。SQLite 不是使用 TRUNCATE,而是使用 DELETE 這個指令。 Reference SQLite: TRUNCATE TABLE Statement | totn SQLite ▍SQLite 的時間與日期函數 在 SQLite 中有五個關於時間和日期的函數: date(time-value, ...) : The date() function returns the date in this...
Python / 如何處裡亞洲文字(Unicode, UTF-8)?以兩個字元計算顯示長度?轉換字串與bytes?
目錄 將 utf-8 字串轉換為 bytes 格式,並計算 bytes 長度 ▍將 utf-8 字串轉換為 bytes 格式,並計算 bytes 長度 使用 encode() 函數可將字串轉換為 bytes 格式,若將 bytes 印出來可以看到字串最前面是以 b'' 開頭顯示表示此為 bytes array。其中可見原本標準的 ASCII 字元能然維持一個 byte 長度,而且直接顯示字元。如果是 Unicode 文字則是用 \x 16進位的方式表示,且以中文字為例在 UTF-8 編碼下是 3 個 bytes 長度。例如:”串”的 Unicode 編碼為 \xe4\xb8\xb2。 若要取得字串的 bytes 總長度,在轉換成 bytes 格式之後可以直接使用 len() 函數取得長度。 Reference How can I...
Mac / Python使用Selenium爬蟲無法開啟chromedriver
最近更新MacOS之後發現正在開發的Python爬蟲程式無法啟動chromedriver了,系統出現了下面這段警告訊息: “chromedriver” cannot be opened because it is from an unidentified developer.macOS cannot verify that this app is free from malware. 中文的介面應該會顯示: 無法打開「chromedriver」,因為它來自未識別的開發者。macOS無法驗證此App未包含惡意軟體。 稍微Google一下發現好像很多人都有遇到類似的狀況,大概都是因為新版的MacOS對安全性的要求變得更高,導致許多沒有被認證的程式預設都被禁止執行,有些從網路上下載的程式也有可能遇到這種狀況。 解決的辦法有兩種: ▍取消程式的隔離註記(quarantine flag) 執行步驟: 開啟終端機(terminal) 移動到該程式的目錄下,如我的chromedriver放在下面的目錄下 執行下列任一個指令 xattr 編輯檔案目錄的附加屬性這個系統指令可以編輯檔案目錄的附加屬性,例如系統目錄屬性(com.apple.FinderInfo)或是這邊要講的隔離屬性(com.apple.quarantine)。xattr指令的語法是:xattr <options> attributes <name of application>在chromedirver所在的目錄下,執行xattr指令使用 -d 移除chromedriver的隔離屬性(com.apple.quarantine): spctl 編輯程式的安全性權限標記通常不會是這個原因造成chromedriver無法開啟,不過偶爾還是會遇到類似的狀況。出於安全性的理由,對於一些無法辨識來源的程式系統可能會禁止執行,使用spctl指令可以開啟”任何來源“的程式執行權限。spctl指令的語法是:spctl <option> <assessment label> <label name> <name of application> ▍使用開發者工作(Developer Tools) 第二種方法是使用開發者工作(Developers Tools)。如果你有安裝X-Code的話,可以將chromediver加入系統的開發者工具清單中,開發者工具會忽略隔離標記(qurantine...
CSS / margin 邊界重疊
如果你對你的網站有複雜的 CSS 設定時,你可能會發現一種狀況,就是前後兩個 block 元件的邊界會有重疊的狀況。前一個元件的下邊界 (margin-bottom) 會和後一個元件的上邊界 (margin-top) 重疊,只會保留兩個之中較大的那一個,這就稱之為邊界重疊 (margin collapsing)。 不過有兩種例外狀況,當元件有設定 float 或 position: absolute 屬性,就不會產生邊界重疊的現象。 會產生邊界重疊的狀況 ▍ 同一層的元件相鄰 兩個位在同一層的 block 元件相鄰就會產生邊界重疊,margin 只會取其中最大的一邊。就像下面的範例,前後兩個段落之間的邊界最後只會有 40px。 <p style="margin-bottom: 16px">First element</p> <p style="margin-top: 40px">Second element</p> ▍ 父元素的邊界與第一個/最後一個子元素的邊界重疊 當子元素的邊界與父元素的邊界重疊時,依然只會取最大的邊界。下面的範例當中,段落 (p) 是區塊 (div) 的子元素,父子元素間的上下邊界都有邊界重疊的情況。最終上邊界取子元素的 20px、下邊界取父元素的 80px。 <div style="margin-top: 15px; margin-bottom: 80px;"> <p style="margin-top: 20px; margin-bottom: 20px;"> this parameter...