启用Python将PDF/HTML转为Markdown的几种办法

在爬虫项目中,我们经常需要将PDF或HTML内容转换为更易处理的Markdown格式。以下是几种常用的方法

1. 使用pdf2md (针对PDF转MD)

安装依赖

bash

pip install pdfminer.six python-docx markdown

PDF转Markdown函数

python

import io
from pdfminer.high_level import extract_text
from docx import Document

def pdf_to_markdown(pdf_path, md_path=None):
    """
    将PDF文件转换为Markdown格式
    :param pdf_path: PDF文件路径
    :param md_path: 输出的Markdown文件路径(可选)
    :return: Markdown文本(如果md_path为None)
    """
    # 提取PDF文本
    text = extract_text(pdf_path)
    
    # 简单清理和转换
    md_content = text.replace('\n\n', '\n').replace('\n', '  \n')
    
    if md_path:
        with open(md_path, 'w', encoding='utf-8') as f:
            f.write(md_content)
        return None
    return md_content

2. 使用html2text (针对HTML转MD)

安装

bash

pip install html2text

HTML转Markdown函数

python

import html2text

def html_to_markdown(html_content, md_path=None):
    """
    将HTML内容转换为Markdown格式
    :param html_content: HTML字符串或文件路径
    :param md_path: 输出的Markdown文件路径(可选)
    :return: Markdown文本(如果md_path为None)
    """
    # 如果是文件路径则读取内容
    if isinstance(html_content, str) and html_content.endswith(('.html', '.htm')):
        with open(html_content, 'r', encoding='utf-8') as f:
            html_content = f.read()
    
    # 创建转换器
    h = html2text.HTML2Text()
    h.ignore_links = False  # 不忽略链接
    h.bypass_tables = False  # 转换表格
    h.mark_code = True  # 标记代码块
    
    md_content = h.handle(html_content)
    
    if md_path:
        with open(md_path, 'w', encoding='utf-8') as f:
            f.write(md_content)
        return None
    return md_content

3. 使用pypandoc (通用转换工具)

安装

bash

pip install pypandoc
# 还需要安装pandoc: https://pandoc.org/installing.html

通用转换函数

python

import pypandoc

def convert_to_markdown(input_path, output_path=None, input_format=None):
    """
    通用文档转换函数(支持PDF/HTML/DOCX等)
    :param input_path: 输入文件路径
    :param output_path: 输出文件路径(可选)
    :param input_format: 输入格式(如'html','pdf'), 自动检测
    :return: Markdown文本(如果output_path为None)
    """
    # 自动检测格式
    if input_format is None:
        if input_path.endswith('.pdf'):
            input_format = 'pdf'
        elif input_path.endswith(('.html', '.htm')):
            input_format = 'html'
        elif input_path.endswith('.docx'):
            input_format = 'docx'
        else:
            input_format = 'markdown'
    
    # 转换选项
    extra_args = ['--wrap=none']  # 不自动换行
    
    # 执行转换
    output = pypandoc.convert_file(
        input_path, 
        'markdown', 
        format=input_format,
        extra_args=extra_args
    )
    
    if output_path:
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(output)
        return None
    return output

4. 综合封装类

python

class DocumentConverter:
    def __init__(self):
        self.html_converter = html2text.HTML2Text()
        self.html_converter.ignore_links = False
        self.html_converter.bypass_tables = False
    
    def convert(self, input_content, output_path=None, input_type='auto'):
        """
        通用文档转换方法
        :param input_content: 输入内容(文件路径或字符串)
        :param output_path: 输出路径(可选)
        :param input_type: 输入类型(pdf/html/auto)
        :return: Markdown内容(如果output_path为None)
        """
        # 自动检测输入类型
        if input_type == 'auto':
            if isinstance(input_content, str):
                if input_content.lower().endswith('.pdf'):
                    input_type = 'pdf'
                elif input_content.lower().endswith(('.html', '.htm')):
                    input_type = 'html'
                elif input_content.lower().startswith('

使用示例

转换PDF

python

# PDF转MD
pdf_text = pdf_to_markdown('document.pdf', 'output.md')

# 使用综合类
converter = DocumentConverter()
converter.convert('document.pdf', 'output.md')

转换HTML

python

# HTML字符串转MD
html_content = "

Title

Paragraph

" md_content = html_to_markdown(html_content) # HTML文件转MD html_to_markdown('page.html', 'page.md') # 使用综合类 converter = DocumentConverter() converter.convert('page.html', 'page.md')

注意事项

  1. PDF转换精度:PDF转Markdown通常会有格式损失,复杂排版可能无法完美转换

  2. HTML转换:html2text对复杂网页的支持有限,可能需要调整参数

  3. 依赖管理:pypandoc需要额外安装pandoc,但转换效果最好

  4. 编码问题:确保处理文件时使用正确的编码(通常是utf-8)

  5. 性能考虑:大文件转换可能消耗较多内存,可考虑分块处理

以上方法可以根据项目需求选择使用,对于简单的转换html2text和pdfminer足够,对于更复杂的需求建议使用pypandoc。

posted @ 2025-12-06 11:39  gccbuaa  阅读(467)  评论(1)    收藏  举报