杰瑞科技汇

Python如何从HTML提取数据存入数据库?

Python 作为“胶水语言”,负责:

Python如何从HTML提取数据存入数据库?-图1
(图片来源网络,侵删)
  1. 连接 到数据库。
  2. 执行 SQL 查询,从数据库中提取数据。
  3. 处理 数据(格式化、计算)。
  4. 使用一个模板引擎,将处理后的数据动态嵌入到 HTML 模板中,生成最终的 HTML 页面。

下面我将分步详细解释这个过程,并提供从简单到复杂的完整代码示例。


核心流程

  1. 数据库准备: 确保你有一个数据库,并且里面有数据。
  2. Python 连接数据库: 使用合适的 Python 库(如 pymysql for MySQL, psycopg2 for PostgreSQL, sqlite3 for SQLite)连接到你的数据库。
  3. 数据查询: 编写 SQL 语句并执行,获取数据,数据通常以列表或字典的形式返回。
  4. HTML 模板创建: 创建一个 HTML 文件,在需要插入数据的地方使用特殊的占位符({{ variable_name }})。
  5. 模板渲染: 使用 Python 模板引擎(如 Jinja2 是最流行和强大的选择)将数据填充到 HTML 模板中,生成最终的、完整的 HTML 字符串。
  6. 输出结果: 将生成的 HTML 保存到文件,或者通过 Web 框架(如 Flask, Django)直接在浏览器中显示。

第一步:准备工作

假设我们有一个简单的 SQLite 数据库,存储着一些文章信息。

  1. 安装必要的库 我们主要需要 Jinja2 来处理模板,如果你的数据库是 MySQL 或 PostgreSQL,你还需要相应的驱动库。

    # 安装 Jinja2 模板引擎
    pip install Jinja2
    # 如果使用 MySQL
    pip install pymysql
    # 如果使用 PostgreSQL
    pip install psycopg2-binary
  2. 创建一个示例数据库和数据

    Python如何从HTML提取数据存入数据库?-图2
    (图片来源网络,侵删)

    创建一个名为 mydatabase.db 的 SQLite 文件,并插入一些数据,你可以用以下 Python 脚本来快速创建:

    # setup_database.py
    import sqlite3
    # 连接到数据库 (如果不存在则创建)
    conn = sqlite3.connect('mydatabase.db')
    cursor = conn.cursor()
    # 创建一个 'articles' 表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS articles (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        content TEXT NOT NULL,
        author TEXT NOT NULL,
        publish_date DATE
    )
    ''')
    # 插入一些示例数据
    articles_data = [
        ('Python入门', 'Python是一种解释型、高级和通用的编程语言。', '张三', '2025-01-15'),
        ('HTML与CSS', 'HTML和CSS是构建网页的基础技术。', '李四', '2025-02-20'),
        ('数据库简介', '数据库用于存储、管理和检索数据。', '张三', '2025-03-10')
    ]
    cursor.executemany("INSERT INTO articles (title, content, author, publish_date) VALUES (?, ?, ?, ?)", articles_data)
    # 提交更改并关闭连接
    conn.commit()
    conn.close()
    print("数据库和示例数据已创建。")

    运行这个脚本后,你的项目目录下会多出一个 mydatabase.db 文件。


第二步:创建 HTML 模板

在你的项目目录下,创建一个名为 templates 的文件夹,并在其中创建一个 article_list.html 文件。

这个文件包含了一些 Jinja2 的模板语法:

  • {% for ... %}: 循环遍历数据。
  • 打印变量的值。
  • {% if ... %}: 条件判断。

templates/article_list.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">文章列表</title>
    <style>
        body { font-family: sans-serif; margin: 2em; }
        h1 { color: #333; }
        .article-card {
            border: 1px solid #ddd;
            padding: 15px;
            margin-bottom: 15px;
            border-radius: 5px;
        }
        .article-title { color: #0056b3; }
        .article-meta { font-size: 0.8em; color: #666; margin-bottom: 10px; }
    </style>
</head>
<body>
    <h1>从数据库提取的文章列表</h1>
    <div class="articles-container">
        {# 这是一个注释 #}
        {% for article in articles %}
            <div class="article-card">
                <h2 class="article-title">{{ article.title }}</h2>
                <p class="article-meta">
                    作者: {{ article.author }} | 发布日期: {{ article.publish_date }}
                </p>
                <p>
                    {{ article.content }}
                </p>
            </div>
        {% else %}
            <p>没有找到任何文章。</p>
        {% endfor %}
    </div>
</body>
</html>

第三步:编写 Python 脚本进行数据提取和渲染

我们编写主脚本来连接数据库、查询数据并使用 Jinja2 渲染模板。

generate_html.py

import sqlite3
from jinja2 import Environment, FileSystemLoader
def main():
    # 1. 连接到数据库
    try:
        # 使用 'with' 语句可以自动处理连接的关闭
        with sqlite3.connect('mydatabase.db') as conn:
            # 设置 row_factory 使得查询结果像字典一样通过列名访问
            conn.row_factory = sqlite3.Row
            cursor = conn.cursor()
            # 2. 执行 SQL 查询
            cursor.execute("SELECT * FROM articles ORDER BY publish_date DESC")
            # fetchall() 获取所有结果,返回一个列表,列表中的每个元素是一个 sqlite3.Row 对象
            articles_data = cursor.fetchall()
            print(f"成功从数据库获取 {len(articles_data)} 条文章数据。")
    except sqlite3.Error as e:
        print(f"数据库错误: {e}")
        return
    # 3. 设置 Jinja2 环境
    # 指定模板文件夹的路径
    file_loader = FileSystemLoader('templates')
    # 创建一个环境对象
    env = Environment(loader=file_loader)
    # 4. 加载模板文件
    try:
        template = env.get_template('article_list.html')
    except Exception as e:
        print(f"模板加载错误: {e}")
        return
    # 5. 渲染模板
    # 将 Python 字典传递给模板
    # sqlite3.Row 对象可以像字典一样使用,所以可以直接传递
    output = template.render(articles=articles_data)
    # 6. 将渲染后的 HTML 写入文件
    with open('output.html', 'w', encoding='utf-8') as f:
        f.write(output)
    print("HTML 文件已成功生成: output.html")
if __name__ == '__main__':
    main()

第四步:运行和查看结果

  1. 确保你的项目目录结构如下:

    /your_project
    ├── mydatabase.db       (由 setup_database.py 创建)
    ├── setup_database.py
    ├── generate_html.py
    └── /templates
        └── article_list.html
  2. 在终端中运行主脚本:

    python generate_html.py
  3. 你会看到终端输出:

    成功从数据库获取 3 条文章数据。
    HTML 文件已成功生成: output.html
  4. 在项目根目录下会新生成一个 output.html 文件,用浏览器打开它,你将看到一个美观的、数据来自数据库的 HTML 页面。


进阶:使用 Web 框架 (Flask 示例)

在实际的 Web 应用中,你不会先生成一个静态 HTML 文件,而是使用 Web 框架(如 Flask 或 Django)来动态地生成和响应 HTML。

这里是一个使用 Flask 的简单例子:

  1. 安装 Flask

    pip install Flask
  2. 创建 Flask 应用 (app.py)

    from flask import Flask, render_template
    import sqlite3
    app = Flask(__name__)
    def get_db_connection():
        conn = sqlite3.connect('mydatabase.db')
        conn.row_factory = sqlite3.Row  # 允许通过列名访问
        return conn
    @app.route('/')
    def index():
        conn = get_db_connection()
        articles = conn.execute('SELECT * FROM articles ORDER BY publish_date DESC').fetchall()
        conn.close()
        # render_template 会自动在 'templates' 文件夹中查找模板
        # 并将 articles 变量传递给它
        return render_template('article_list.html', articles=articles)
    if __name__ == '__main__':
        app.run(debug=True)
  3. 运行 Flask 应用

    python app.py
  4. 访问页面 打开浏览器,访问 http://127.0.0.1:5000,你将看到和之前 output.html 完全一样的页面,但现在它是动态生成的,每次刷新页面,Flask 都会重新从数据库查询数据并渲染页面。

方法 优点 缺点 适用场景
Python 脚本生成静态文件 简单、直接,不依赖 Web 服务器。 生成的页面是静态的,无法实时更新。 生成报告、文档、静态网站内容。
Web 框架 (Flask/Django) 动态、交互式,适合构建真正的 Web 应用。 需要理解 Web 框架的概念,部署稍复杂。 几乎所有现代网站和 Web 应用。

对于初学者,建议从 Python 脚本生成静态文件 的方式开始,因为它清晰地展示了数据提取和模板渲染的核心逻辑,当你需要构建动态网站时,再学习 FlaskDjango 这样的 Web 框架。

分享:
扫描分享到社交APP
上一篇
下一篇