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

news2024/11/19 5:39:15

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/898516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你使用人工智能生成游戏 3D 素材

引言 生成式 AI 已成为游戏开发中艺术工作流的重要组成部分。然而,正如我在之前的文章: 《AI 制作 3D 素材|基于 AI 5 天创建一个农场游戏,第 3 天》中描述的,从文本到 3D 的实用性仍落后于 2D。不过,这种情况正在改变…

集成大淘客实现多个电商平台的数据互连

大淘客是一家导购优惠平台。 它通过整合多个电商平台的商品和优惠信息,为用户提供高品质、低价格的商品推荐和购物指南。 场景描述: 基于大淘客开放平台的API能力,零代码实现多个电商平台的导购数据、商品数据、账号销售数据和其它应用数据…

51单片机简易数字万用表(电阻电流电压测量)仿真设计( proteus仿真+程序+报告+讲解视频)

目录 51单片机简易数字万用表(电阻电流电压测量)仿真设计( proteus仿真程序报告讲解视频)1.主要功能:2.仿真3. 程序代码4. 设计资料内容清单&下载地址 51单片机简易数字万用表(电阻电流电压测量)仿真设计( proteus仿真程序报告讲解视频) …

KeilMDK V5编译器的安装

1、安装原因 目前keil官网最新版本的Keil都是默认安装V6编译器,不再自动安装V5编译器,而V5与V6编译器在编译的时候有很多代码不兼容,导致工程编译失败,所以我们使用新版keil5的时候,要用V5编译器就要自己安装V5编译器。…

微信小程序自定义tabBar详细教程,且自适应尺寸和实现高斯模糊版

IOS示例&#xff1a; 安卓示例&#xff1a; 高斯模糊示例&#xff1a; WXML代码&#xff1a; <view class"tabbar"><view style"{{selectindex&&index0?color: #ef3166;:}}"class"tabbar-item {{ select index ? tabbar-select …

WMS系统条码管理

一、条码的基本概念和应用&#xff1a; WMS系统条码管理是指在仓库管理系统中使用条码技术对货物、物料和库存信息进行标识、跟踪和管理的过程。它基于条码识别和数据采集技术&#xff0c;通过在物料或货物上粘贴或打印条码标签&#xff0c;并使用条码扫描设备进行扫描和读取&…

深入理解内存 —— 函数栈帧的创建与销毁

前言 一位优秀的程序员&#xff0c;必须对内存的分布有深刻的理解&#xff0c;在初学编程的时候&#xff0c;往往有诸如以下很多问题困扰着初学者&#xff0c;而通过今天的分享&#xff0c;我们就可以通过自己的观察&#xff0c;将这些问题统统解决掉 局部变量是怎么创建的&…

架构师必备--高可用高性能分布式数据库Tidb安装部署实践

本文针对分布式、高可用的tidb数据库&#xff0c;从搭建实际生产环境的集群服务&#xff0c;介绍下tidb的安装流程、安装前的环境检测和系统优化、服务访问等方面介绍下具体的流程&#xff0c;希望对大家熟悉和了解tidb数据库有所帮助&#xff0c;减少不必要的弯路。 1.概述 …

图形推理|解题思路汇总

一、图形推理题常见题型 &#xff08;一&#xff09;图形的位置 图形的位置主要是指与图形位置相关的图形推理考点规律。 这类题目的图形特点通常有以下两类: (1)题干图形相似程度很高&#xff0c;只是某些部分的位置有差异-&#xff0c;考虑移动、旋转与翻转。…

自动编码器中的马尔可夫链蒙特卡罗期望最大化 (MCMC-EM):使用贝叶斯推理增强学习

一、介绍 自动编码器 自动编码器是强大的无监督学习算法&#xff0c;用于表示学习和降维。它们的工作原理是将输入数据编码为低维表示形式&#xff0c;然后将其解码回以重建原始数据。训练自动编码器通常涉及优化参数以最小化重建误差。然而&#xff0c;传统的优化技术&#xf…

如何通过MAT排查生产环境服务内存溢出

前言 前段时间&#xff0c;运维反馈生产环境翻译服务某个节点触发内存告警了。运维在重启节点之前&#xff0c;生成了dump快照&#xff0c;这里介绍下如何使用MAT内存分析工具来排查服务内存高占用问题。 MAT简介 MAT是Memory Analyzer的简称&#xff0c;它是一款功能强大的…

前端技术Vue学习笔记--005

Vue学习笔记 一、非父子通信-event bus 事件总线 作用&#xff1a;非父子组件之间&#xff0c;进行简易消息传递。&#xff08;复杂场景用----Vuex&#xff09; 使用步骤&#xff1a; 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09;-----utils/EventBus.js /…

浅谈更糟糕的 CS_CLASSDC 标志位的作用

在上一篇文章中&#xff0c;我们了解了 CS_OWNDC 标志位的历史&#xff0c;也说明了设计它的初衷。 这个标志位一开始看起来是个挺好的设计&#xff0c;但是如果你多琢磨一会儿&#xff0c;就会发现它不是一个好主意。今天我们来看看更糟的。 CS_CLASSDC 标志位有点类似 CS_OW…

shell脚本文本三剑客sed

shell脚本文本三剑客sed 一.Sed编辑器1.1sed概述1.2sed工作流程1.3sed基本法1.4sed常用选项1.5sed命令的常用操作 二.sed命令使用2.1打印内容2.2删除内容示例5&#xff1a;先备份内容在删除2.3插入内容2.4取反2.5搜索替代2.6分组调用 一.Sed编辑器 1.1sed概述 sed编辑器是一种…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后&#xff0c;可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后&#xff0c;再连接虚拟机就连不上了&#xff0c;于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题&#xff0c;又可以连接上了&#xff…

Python “贪吃蛇”游戏,在不断改进中学习pygame编程

目录 前言 改进过程一 增加提示信息 原版帮助摘要 pygame.draw pygame.font class Rect class Surface 改进过程二 增加显示得分 改进过程三 增加背景景乐 增加提示音效 音乐切换 静音切换 mixer.music.play 注意事项 原版帮助摘要 pygame.mixer pygame.mix…

SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先&#xff0c;如果在某个类或某个方法被标记为Transactional时&#xff0c;Spring boot底层会在创建这个bean时生成代理对象&#xff08;默认使用cglib) 示例&#xff1a; 当调用studentService的addStudent方法时&#xff0c;会直接跳到CglibAopProxy类去执行intercept方…

vscode里配置C#环境并运行.cs文件

vscode是一款跨平台、轻量级、开源的IDE, 支持C、C、Java、C#、R、Python、Go、Nodejs等多种语言的开发和调试。下面介绍在vscode里配置C#环境。这里以配置.Net SDK v5.0&#xff0c;语言版本为C#9.0&#xff0c;对应的开发平台为VS2019&#xff0c;作为案例说明。 1、下载vsc…

vue3小知识点汇总——基础积累

下面的小知识点比较零散&#xff0c;但是脑子不太好使&#xff0c;只能先记录一下啦&#xff0c;后面知识丰富起来后&#xff0c;慢慢就懂了。 1.最新版node.js已经不兼容vue2的项目了&#xff0c;学习vue3势在必行 node.js的安装及vue的搭建详细步骤&#xff1a;http://t.cs…

比特币暴跌的4个原因

作者&#xff1a;秦晋 加密市场每隔一段时间&#xff0c;就会迎来一次「暴跌」&#xff0c;而且每次暴跌原因各不相同。但归根到底都是「恐慌情绪」在作怪。继「312暴跌」、「519暴跌」之后&#xff0c;又迎来一个「8.18暴跌」。相比前两次暴跌&#xff0c;此次暴跌的原因或许略…