使用 pyodbc 解析chrome浏览器导出的书签并保存到 Microsoft Access 数据库

使用 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.AppMyFrame 对象。

完整的示例代码可以在下面找到:

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 数据库的应用程序。您可以根据自己的需求进行修改和扩展。

希望本篇博客对您有所帮助!如果您有任何问题或疑问,请随时提问。

猜你喜欢

转载自blog.csdn.net/winniezhang/article/details/132356354