Skip to content

内容格式化

不同平台对内容格式的要求差异很大。本章介绍如何将统一的 Markdown 源文件转换为各平台兼容的格式。

格式差异概览

平台原生格式Markdown 支持特殊要求
微信公众号富文本 HTML不支持图片必须上传到微信服务器
知乎富文本部分支持有自己的编辑器格式
掘金Markdown完全支持需要设置分类和标签
小红书纯文本 + 图片不支持以图片为主,文字为辅
CSDNMarkdown完全支持支持多种编辑模式
WordPressHTML插件支持取决于主题和插件

Markdown 转换基础

安装依赖

bash
pip install markdown
pip install markdown-it-py
pip install beautifulsoup4

基础转换

python
import markdown

def markdown_to_html(md_content):
    """将 Markdown 转换为 HTML"""
    html = markdown.markdown(
        md_content,
        extensions=[
            'extra',        # 表格、脚注等扩展
            'codehilite',   # 代码高亮
            'toc',          # 目录生成
            'tables'        # 表格支持
        ]
    )
    return html

微信公众号格式适配

微信公众号是最复杂的平台,需要特殊处理。

核心问题

  1. 不支持 Markdown:必须转换为富文本 HTML
  2. 图片限制:外链图片会被过滤,必须上传到微信服务器
  3. 样式限制:只支持内联样式,不支持外部 CSS

转换方案

python
def markdown_to_wechat(md_content):
    """将 Markdown 转换为微信公众号格式"""
    # 先转换为 HTML
    html = markdown.markdown(md_content, extensions=['extra', 'tables'])

    # 添加微信兼容的内联样式
    html = add_wechat_styles(html)

    return html

def add_wechat_styles(html):
    """添加微信公众号兼容的样式"""
    from bs4 import BeautifulSoup

    soup = BeautifulSoup(html, 'html.parser')

    # 标题样式
    for h1 in soup.find_all('h1'):
        h1['style'] = 'font-size: 24px; font-weight: bold; color: #333;'

    for h2 in soup.find_all('h2'):
        h2['style'] = 'font-size: 20px; font-weight: bold; color: #333;'

    # 代码块样式
    for code in soup.find_all('code'):
        code['style'] = 'background: #f5f5f5; padding: 2px 6px; border-radius: 3px;'

    # 段落样式
    for p in soup.find_all('p'):
        p['style'] = 'line-height: 1.8; margin: 16px 0;'

    return str(soup)

复制到剪贴板

微信公众号编辑器需要 text/html 格式的数据:

python
import pyperclip

def copy_to_wechat_clipboard(html_content):
    """复制为微信公众号可用的格式"""
    # 注意:这需要在浏览器环境中执行
    # Python 中可以生成 HTML 文件,然后手动复制
    with open('output.html', 'w', encoding='utf-8') as f:
        f.write(html_content)
    print("已生成 output.html,请在浏览器中打开并复制")

图片处理

提取文章中的图片

python
import re

def extract_images(md_content):
    """提取 Markdown 中的所有图片"""
    pattern = r'!\[([^\]]*)\]\(([^)]+)\)'
    matches = re.findall(pattern, md_content)
    return [(alt, url) for alt, url in matches]

下载并上传图片

python
import requests
import os

def download_image(url, save_path):
    """下载图片到本地"""
    response = requests.get(url, timeout=30)
    if response.status_code == 200:
        with open(save_path, 'wb') as f:
            f.write(response.content)
        return True
    return False

def process_images(md_content, upload_func):
    """处理文章中的所有图片"""
    images = extract_images(md_content)

    for alt, url in images:
        # 下载图片
        filename = os.path.basename(url)
        local_path = f"temp/{filename}"
        download_image(url, local_path)

        # 上传到目标平台
        new_url = upload_func(local_path)

        # 替换原文中的链接
        md_content = md_content.replace(url, new_url)

    return md_content

其他平台适配

知乎格式

python
def markdown_to_zhihu(md_content):
    """转换为知乎格式"""
    # 知乎支持部分 Markdown,但有些语法需要调整
    content = md_content

    # 知乎不支持 HTML 标签
    content = re.sub(r'<[^>]+>', '', content)

    return content

小红书格式

python
def markdown_to_xiaohongshu(md_content):
    """转换为小红书格式"""
    # 小红书以图片为主,文字需要精简
    # 移除 Markdown 标记
    content = re.sub(r'[#*`_\[\]]', '', md_content)

    # 添加表情符号增加可读性
    content = content.replace('。', '~')

    # 限制字数(小红书正文限制 1000 字)
    if len(content) > 1000:
        content = content[:997] + '...'

    return content

统一格式化接口

python
class ContentFormatter:
    """内容格式化器"""

    def __init__(self):
        self.formatters = {
            'wechat': markdown_to_wechat,
            'zhihu': markdown_to_zhihu,
            'xiaohongshu': markdown_to_xiaohongshu,
            'juejin': lambda x: x,  # 掘金原生支持 Markdown
        }

    def format(self, content, platform):
        """格式化内容"""
        formatter = self.formatters.get(platform)
        if formatter:
            return formatter(content)
        return content

下一步

内容格式化完成,接下来构建用户界面。

继续:用户界面 →


← 返回 API 集成 | 用户界面 →

最近更新

基于 Apache 2.0 许可发布