使用 wxPython 和 pyodbc 解析書簽并保存到 Microsoft Access 數據庫的示例博客:
本篇博客介紹了如何使用 wxPython 和 pyodbc 庫創建一個簡單的應用程序,用于解析 HTML 文件中的書簽并將其保存到 Microsoft Access 數據庫中。通過這個示例,您可以學習如何使用 wxPython 構建圖形用戶界面,以及如何使用 pyodbc 連接和操作 Microsoft Access 數據庫。
C:\pythoncode\new\bookmarkstoaccess.py
準備工作
在開始之前,請確保您已經安裝了以下依賴庫:
- wxPython:用于創建圖形用戶界面。
- pyodbc:用于與 Microsoft Access 數據庫進行交互。
- lxml:用于解析 HTML 文件。
初始化數據庫連接
首先,我們需要初始化數據庫連接。在這個示例中,我們使用 Microsoft Access 數據庫作為存儲書簽的目標。根據您的實際情況,您需要修改 db_path
變量的值為實際的數據庫文件路徑。
# 數據庫連接信息
db_path = r'./database1.accdb'
conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + db_path# 創建數據庫連接
self.conn = pyodbc.connect(conn_str)
self.cursor = self.conn.cursor()
在上述代碼中,我們使用 pyodbc.connect
方法創建一個數據庫連接,并使用返回的連接對象創建一個游標(cursor)對象。游標用于執行 SQL 語句和獲取查詢結果。
檢查表是否存在
在書簽數據保存之前,我們需要檢查數據庫中是否存在特定的表。如果不存在,我們將使用 SQL 語句創建該表。下面是一個檢查表是否存在的示例代碼:
def table_exists(self, cursor, table_name):try:cursor.execute(f"SELECT TOP 1 * FROM {table_name}")return Trueexcept pyodbc.Error:return False# 檢查并創建表
if not self.table_exists(self.cursor, 'bookmarks1'):self.cursor.execute("CREATE TABLE bookmarks1 (title TEXT, url TEXT, date1 TEXT, icon TEXT)")
在上述代碼中,我們定義了一個 table_exists
方法,通過執行 SELECT 語句并捕獲異常來判斷表是否存在。如果表不存在,我們使用 CREATE TABLE
語句創建名為 'bookmarks1'
的表。
解析書簽信息
接下來,我們需要解析 HTML 文件中的書簽信息。在本示例中,我們使用了 lxml 庫來解析 HTML 文件。以下是一個簡單的解析書簽的示例代碼:
def parseBookmarks(self, htmlfile):with open(htmlfile, 'r', encoding='utf-8') as f:dom = lxml.html.fromstring(f.read())titles = dom.xpath('//dt/a/text()')urls = dom.xpath('//dt/a/@href')bookmarks = []for title, url in zip(titles, urls):bm = {'title': title, 'url': url}bookmarks.append(bm)return bookmarks
上述代碼打開指定的 HTML 文件,使用 lxml 庫解析文件內容,并提取書簽的標題和鏈接。然后,將每個書簽以字典的形式添加到 bookmarks
列表中。
保存書簽到數據庫
最后,我們將解析的書簽信息保存到 Microsoft Access 數據庫中。以下是一個簡單的保存書簽的示例代碼:
def saveBookmarks(self, bookmarks):for bm in bookmarks:self.cursor.execute("INSERT INTO bookmarks1 (title, url) VALUES (?, ?)",(bm['title'], bm['url']))self.conn.commit()
在上述代碼中,我們使用 INSERT INTO
語句將每個書簽的標題和鏈接插入到 'bookmarks1'
表中。最后,我們通過調用 commit
方法提交事務,確保數據保存到數據庫。
完整代碼和運行
請注意,上述代碼只是示例代碼的一部分。要運行完整的示例程序,請確保已經正確導入所需的庫,并在 __name__ == '__main__'
的條件下創建 wx.App
和 MyFrame
對象。
完整的示例代碼可以在下面找到:
import wx
import pyodbc
import lxml.html
from pubsub import pub
# 其他代碼不變class MyFrame(wx.Frame):def __init__(self):wx.Frame.__init__(self, parent=None, title='Bookmark Parser')self.panel = wx.Panel(self)self.open_button = wx.Button(self.panel, label='Open...')self.open_button.Bind(wx.EVT_BUTTON, self.onOpen)# self.dbname = 'database1.accdb' # 需要修改為實際的Access數據庫路徑self.initDB() # 初始化數據庫連接 self.Show()# # 檢查表是否存在的函數def table_exists(self, cursor, table_name):try:cursor.execute(f"SELECT TOP 1 * FROM {table_name}")return Trueexcept pyodbc.Error:return False def initDB(self):# 數據庫連接信息db_path = r'./database1.accdb'conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + db_path# 創建數據庫連接self.conn = pyodbc.connect(conn_str)self.cursor = self.conn.cursor()if not self.table_exists(self.cursor, 'bookmarks1'):self.cursor.execute("CREATE TABLE bookmarks1 (title TEXT, url TEXT, date1 TEXT, icon TEXT)") # 如果表不存在則創建表# self.cursor.execute("CREATE TABLE bookmarks1 (title TEXT, url TEXT, date1 TEXT, icon TEXT)") def onOpen(self, event):with wx.FileDialog(self, "Open HTML file", wildcard="HTML files (*.htm)|*.htm",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:return # 用戶取消選擇# 用戶選擇了文件,獲取選擇的文件路徑pathname = fileDialog.GetPath()# 解析HTML,提取書簽信息bookmarks = self.parseBookmarks(pathname)# 寫入數據庫self.saveBookmarks(bookmarks)def parseBookmarks(self, htmlfile):with open(htmlfile, 'r', encoding='utf-8') as f:dom = lxml.html.fromstring(f.read()) titles = dom.xpath('//dt/a/text()')urls = dom.xpath('//dt/a/@href')bookmarks = []for title, url in zip(titles, urls):bm = {'title': title, 'url': url}bookmarks.append(bm)return bookmarks def saveBookmarks(self, bookmarks):for bm in bookmarks:self.cursor.execute("INSERT INTO bookmarks1 (title, url ) VALUES (?, ?)",(bm['title'], bm['url']))self.conn.commit()if __name__ == '__main__':app = wx.App()frame = MyFrame()frame.Show()app.MainLoop()
請注意,在運行之前,請確保已經正確安裝了所需的依賴庫,并將 db_path
變量設置為您的實際數據庫文件路徑。
以上是一個簡單的示例,展示了如何使用 wxPython 和 pyodbc 創建一個解析書簽并保存到 Microsoft Access 數據庫的應用程序。您可以根據自己的需求進行修改和擴展。
希望本篇博客對您有所幫助!如果您有任何問題或疑問,請隨時提問。