启用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')
注意事项
PDF转换精度:PDF转Markdown通常会有格式损失,复杂排版可能无法完美转换
HTML转换:html2text对复杂网页的支持有限,可能需要调整参数
依赖管理:pypandoc需要额外安装pandoc,但转换效果最好
编码问题:确保处理文件时使用正确的编码(通常是utf-8)
性能考虑:大文件转换可能消耗较多内存,可考虑分块处理
以上方法可以根据项目需求选择使用,对于简单的转换html2text和pdfminer足够,对于更复杂的需求建议使用pypandoc。

浙公网安备 33010602011771号