在爬虫项目中,我们经常需要将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 Documentdef 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 Nonereturn md_content
2. 使用html2text (针对HTML转MD)
安装
bash
pip install html2text
HTML转Markdown函数
python
import html2textdef 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 Nonereturn md_content
3. 使用pypandoc (通用转换工具)
安装
bash
pip install pypandoc
# 还需要安装pandoc: https://pandoc.org/installing.html
通用转换函数
python
import pypandocdef 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 Nonereturn output
4. 综合封装类
python
class DocumentConverter:def __init__(self):self.html_converter = html2text.HTML2Text()self.html_converter.ignore_links = Falseself.html_converter.bypass_tables = Falsedef 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')
注意事项
PDF转换精度:PDF转Markdown通常会有格式损失,复杂排版可能无法完美转换
HTML转换:html2text对复杂网页的支持有限,可能需要调整参数
依赖管理:pypandoc需要额外安装pandoc,但转换效果最好
编码问题:确保处理文件时使用正确的编码(通常是utf-8)
性能考虑:大文件转换可能消耗较多内存,可考虑分块处理
以上方法可以根据项目需求选择使用,对于简单的转换html2text和pdfminer足够,对于更复杂的需求建议使用pypandoc。