Skip to main content

GitHub Workflow Status Pypi version License Pypi Downloads

Installation

pip install markdownify

Usage

Convert some HTML to Markdown:

from markdownify import markdownify as md
md('<b>Yay</b> <a href="http://github.com">GitHub</a>')  # > '**Yay** [GitHub](http://github.com)'

Specify tags to exclude:

from markdownify import markdownify as md
md('<b>Yay</b> <a href="http://github.com">GitHub</a>', strip=['a'])  # > '**Yay** GitHub'

...or specify the tags you want to include:

from markdownify import markdownify as md
md('<b>Yay</b> <a href="http://github.com">GitHub</a>', convert=['b'])  # > '**Yay** GitHub'

Options

Markdownify supports the following options:

strip

A list of tags to strip. This option can’t be used with the convert option.

convert

A list of tags to convert. This option can’t be used with the strip option.

autolinks

A boolean indicating whether the “automatic link” style should be used when a a tag’s contents match its href. Defaults to True.

default_title

A boolean to enable setting the title of a link to its href, if no title is given. Defaults to False.

heading_style

Defines how headings should be converted. Accepted values are ATX, ATX_CLOSED, SETEXT, and UNDERLINED (which is an alias for SETEXT). Defaults to UNDERLINED.

bullets

An iterable (string, list, or tuple) of bullet styles to be used. If the iterable only contains one item, it will be used regardless of how deeply lists are nested. Otherwise, the bullet will alternate based on nesting level. Defaults to '*+-'.

strong_em_symbol

In markdown, both * and _ are used to encode strong or emphasized texts. Either of these symbols can be chosen by the options ASTERISK (default) or UNDERSCORE respectively.

sub_symbol, sup_symbol

Define the chars that surround <sub> and <sup> text. Defaults to an empty string, because this is non-standard behavior. Could be something like ~ and ^ to result in ~sub~ and ^sup^. If the value starts with < and ends with >, it is treated as an HTML tag and a / is inserted after the < in the string used after the text; this allows specifying <sub> to use raw HTML in the output for subscripts, for example.

newline_style

Defines the style of marking linebreaks (<br>) in markdown. The default value SPACES of this option will adopt the usual two spaces and a newline, while BACKSLASH will convert a linebreak to \\n (a backslash and a newline). While the latter convention is non-standard, it is commonly preferred and supported by a lot of interpreters.

code_language

Defines the language that should be assumed for all <pre> sections. Useful, if all code on a page is in the same programming language and should be annotated with ```python or similar. Defaults to '' (empty string) and can be any string.

code_language_callback

When the HTML code contains pre tags that in some way provide the code language, for example as class, this callback can be used to extract the language from the tag and prefix it to the converted pre tag. The callback gets one single argument, a BeautifulSoup object, and returns a string containing the code language, or None. An example to use the class name as code language could be:

def callback(el):
    return el['class'][0] if el.has_attr('class') else None

Defaults to None.

escape_asterisks

If set to False, do not escape * to \* in text. Defaults to True.

escape_underscores

If set to False, do not escape _ to \_ in text. Defaults to True.

escape_misc

If set to True, escape miscellaneous punctuation characters that sometimes have Markdown significance in text. Defaults to False.

keep_inline_images_in

Images are converted to their alt-text when the images are located inside headlines or table cells. If some inline images should be converted to markdown images instead, this option can be set to a list of parent tags that should be allowed to contain inline images, for example ['td']. Defaults to an empty list.

table_infer_header

Controls handling of tables with no header row (as indicated by <thead> or <th>). When set to True, the first body row is used as the header row. Defaults to False, which leaves the header row empty.

wrap, wrap_width

If wrap is set to True, all text paragraphs are wrapped at wrap_width characters. Defaults to False and 80. Use with newline_style=BACKSLASH to keep line breaks in paragraphs. A wrap_width value of None reflows lines to unlimited line length.

strip_document

Controls whether leading and/or trailing separation newlines are removed from the final converted document. Supported values are LSTRIP (leading), RSTRIP (trailing), STRIP (both), and None (neither). Newlines within the document are unaffected. Defaults to STRIP.

strip_pre

Controls whether leading/trailing blank lines are removed from <pre> tags. Supported values are STRIP (all leading/trailing blank lines), STRIP_ONE (one leading/trailing blank line), and None (neither). Defaults to STRIP.

bs4_options

Specify additional configuration options for the BeautifulSoup object used to interpret the HTML markup. String and list values (such as lxml or html5lib) are treated as features arguments to control parser selection. Dictionary values (such as {"from_encoding": "iso-8859-8"}) are treated as full kwargs to be used for the BeautifulSoup constructor, allowing specification of any parameter. For parameter details, see the Beautiful Soup documentation at:

Options may be specified as kwargs to the markdownify function, or as a nested Options class in MarkdownConverter subclasses.

Converting BeautifulSoup objects

from markdownify import MarkdownConverter

# Create shorthand method for conversion
def md(soup, **options):
    return MarkdownConverter(**options).convert_soup(soup)

Creating Custom Converters

If you have a special usecase that calls for a special conversion, you can always inherit from MarkdownConverter and override the method you want to change. The function that handles a HTML tag named abc is called convert_abc(self, el, text, parent_tags) and returns a string containing the converted HTML tag. The MarkdownConverter object will handle the conversion based on the function names:

from markdownify import MarkdownConverter

class ImageBlockConverter(MarkdownConverter):
    """
    Create a custom MarkdownConverter that adds two newlines after an image
    """
    def convert_img(self, el, text, parent_tags):
        return super().convert_img(el, text, parent_tags) + '\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, parent_tags):
        return ''

# Create shorthand method for conversion
def md(html, **options):
    return IgnoreParagraphsConverter(**options).convert(html)

Command Line Interface

Use markdownify example.html > example.md or pipe input from stdin (cat example.html | markdownify > example.md). Call markdownify -h to see all available options. They are the same as listed above and take the same arguments.

Development

To run tests and the linter run pip install tox once, then tox.

Metadata

Release files for markdownify 1.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for markdownify 1.2.3
File Size Uploaded Provenance
markdownify-1.2.3.tar.gz 18.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for markdownify 1.2.3
File Interpreter ABI Platform
markdownify-1.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 34.6 kB

Release files / markdownify-1.2.3.tar.gz

Download URL markdownify-1.2.3.tar.gz
Size 18.9 kB
Tags Source
SHA-256 checksum
How to use checksums
1a176f05522c8a2cb1dd3ab9d307dcdadbed5c26ae717855bfc42b3b6d38d937
BLAKE2b-256 checksum
How to use checksums
92abd1297139c0e2ceb151ae564c8c4f57ac0155d8f1f8b4cbd5d6523c82ea36
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.8.18

Release files / markdownify-1.2.3-py3-none-any.whl

Download URL markdownify-1.2.3-py3-none-any.whl
Size 15.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a189a0bedfd14009030fde5f85bb6f77c56897cb839b5c25315dd7d4e3e290ba
BLAKE2b-256 checksum
How to use checksums
0410fa543d484e8b1199243fe20eedd02cc5af050edebce98a7293a5773df592
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.8.18

Security for markdownify 1.2.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.2.3 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page