使用 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 True
except 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 True
except 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 数据库的应用程序。您可以根据自己的需求进行修改和扩展。
希望本篇博客对您有所帮助!如果您有任何问题或疑问,请随时提问。