一、关于 markdownify
markdownify 是一个将 HTML 转换为Markdown 的Python 工具包
- github : https://github.com/matthewwithanm/python-markdownify (2409 1k star)
安装
pip install markdownify
二、使用
将一些 HTML 转换为Markdown:
from markdownify import markdownify as md
md('<b>Yay</b> <a href="http://github.com">GitHub</a>') # > '**Yay** [GitHub](http://github.com)'
指定要排除的标签:
from markdownify import markdownify as md
md('<b>Yay</b> <a href="http://github.com">GitHub</a>', strip=['a']) # > '**Yay** GitHub'
…或指定要包含的标签:
from markdownify import markdownify as md
md('<b>Yay</b> <a href="http://github.com">GitHub</a>', convert=['b']) # > '**Yay** GitHub'
三、选项
Markdownify支持以下选项:
-
strip
要剥离的标签列表。此选项不能与
convert
选项。 -
convert
要转换的标签列表。此选项不能与
strip
选项。 -
autolinks
一个布尔值,指示何时是否应使用“自动链接”样式 标记
a
内容与其href匹配。默认为True
。 -
default_title
一个布尔值,用于将链接的标题设置为其href,如果没有标题 给定。默认为
False
。 -
heading_style
定义标题应该如何转换。接受的值是
ATX
,ATX_CLOSED
,SETEXT
和UNDERLINED
(这是SETEXT
)。默认为UNDERLINED
。 -
bullets
要使用的项目符号样式的可迭代(字符串、列表或元组)。如果 iterable只包含一个项目,无论多深都会被使用 列表是嵌套的。否则,项目符号将根据嵌套交替 级别。默认为
'*+-'
。 -
strong_em_symbol
在markdown中,
*
和_
都用于编码strong或 强调文本。选项可以选择这些符号中的任何一个ASTERISK
(默认)或UNDERSCORE
分别。 -
sub_symbol, sup_symbol
定义围绕
<sub>
和<sup>
文本的字符。默认为 空字符串,因为这是非标准行为。可能是这样的~
和^
导致~sub~
和^sup^
。如果值开始 使用<
并以>
结尾,它被视为 HTML ,/
是 在文本后面使用的字符串中插入<
之后;这允许 指定<sub>
在下标的输出中使用原始 HTML 例子。 -
newline_style
定义在markdown中标记换行符(
<br>
)的样式。默认值 此选项的值SPACES
将采用通常的两个空格和一个换行符, 而BACKSLASH
会将换行符转换为\\n
(一个反斜杠和一个 换行符)。虽然后一种约定是非标准的,但它通常是 许多口译员的首选和支持。 -
code_language
定义所有
<pre>
部分应采用的语言。 如果页面上的所有代码都使用相同的编程语言并且 应注释为````python或类似。 默认为
’'`(空字符串),可以是任何字符串。 -
code_language_callback
当 HTML 代码包含以某种方式提供代码的
pre
标记时 语言,例如作为类,这个回调可以用来提取 语言标签并将其前缀转换为pre
标签。 回调得到一个参数,一个美丽的汤对象,并返回 包含代码语言的字符串,或None
。 使用类名作为代码语言的示例可以是:def callback(el): return el['class'][0] if el.has_attr('class') else None
默认为None
。 -
escape_asterisks
如果设置为
False
,则不要在文本中将*
转义为\*
。 默认为True
。 -
escape_underscores
如果设置为
False
,则不要在文本中_
转义为\_
。 默认为True
。 -
escape_misc
如果设置为
False
,不要转义其他标点符号 有时在文本中具有Markdown意义。 默认为True
。 -
keep_inline_images_in
当图像位于内部时,图像将转换为其替代文本 标题或表格单元格。如果一些内联图像应该转换为 Markdown图像相反,此选项可以设置为父标签列表 应该允许包含内联图像,例如
['td']
。 默认为空列表。 -
wrap,wrap_width
如果
wrap
设置为True
,则所有文本段落都包装在wrap_width
字符。默认为False
和80
。 使用newline_style=BACKSLASH
来保持段落中的换行符。
选项可以指定为markdownify
函数的kwargs,也可以指定为 MarkdownConverter 子类 嵌套Options
类。
四、转换BeautifulSoup 对象
from markdownify import MarkdownConverter
# Create shorthand method for conversion
def md(soup, **options):
return MarkdownConverter(**options).convert_soup(soup)
五、创建自定义转换器
如果您有一个需要特殊转换的特殊用例,您可以 始终从MarkdownConverter
继承并覆盖您想要的方法 改变。 处理名为abc
的 HTML 的函数 convert_abc(self, el, text, convert_as_inline)
并返回一个字符串 包含转换后的 HTML 。 该MarkdownConverter
对象将根据 函数名称:
from markdownify import MarkdownConverter
class ImageBlockConverter(MarkdownConverter):
"""
Create a custom MarkdownConverter that adds two newlines after an image
"""
def convert_img(self, el, text, convert_as_inline):
return super().convert_img(el, text, convert_as_inline) + '\n\n'
# Create shorthand method for conversion
def md(html, **options):
return ImageBlockConverter(**options).convert(html)
from markdownify import MarkdownConverter
class IgnoreParagraphsConverter(MarkdownConverter):
"""
Create a custom MarkdownConverter that ignores paragraphs
"""
def convert_p(self, el, text, convert_as_inline):
return ''
# Create shorthand method for conversion
def md(html, **options):
return IgnoreParagraphsConverter(**options).convert(html)
六、命令行界面
使用markdownify example.html > example.md
或从标准输入的管道输入 (cat example.html | markdownify > example.md
)。
调用markdownify -h
查看所有可用选项。 它们与上面列出的相同,并采用相同的参数。
markdownify -h
七、开发
要运行测试,linter 运行一次pip install tox
,然后运行tox
。
2024-09-28(六)