extract2md
extract2md is all about “HTML in → Markdown out.” You can start from a live
URL, a file on disk, or an already-loaded HTML string.
It can be used from CLI or as a Python library.
Installation
pip install extract2md
Prerequisites:
- Python 3.10+ runtime
- Node.js (recommended for best results; powers Readability.js content extraction)
CLI usage
1. Fetch a URL and display Markdown
extract2md https://www.iana.org/help/example-domains
2. Fetch and write to a file
extract2md https://www.iana.org/help/example-domains > sample-output.md
3. Convert previously saved HTML (files or stdin)
# convert file
extract2md sample-page.html
# or from stdin
cat sample-page.html | extract2md -
Parameters
Usage: extract2md [OPTIONS] SOURCE
Global
source: HTTP(S) URL, filesystem path, or-when reading HTML from stdin.
Fetching (URL sources only)
--ignore-robots: skip robots.txt validation (use sparingly).--proxy URL: HTTP(S) proxy forwarded to httpx.--timeout SECONDS: request timeout (default 30 seconds).--user-agent STRING: override the default identifier.
HTML rewriting
--rewrite-relative-urls/--no-rewrite-relative-urls: enable or disable rewriting relativehref/srcattributes to absolute links (default on).--base-url URL: optional base URL for rewriting relative URLs (defaultsource).
Conversion
--converter NAME: choose the HTML conversion backend. Defaults totrafilatura;readability(requires Node.js) is also available.
Environment variables
EXTRACT2MD_NODE_PATH: Set theEXTRACT2MD_NODE_PATHenvironment variable to the Node.js binary (or its directory) if Readability.js cannot findnodeon yourPATH.
Python Library usage
extract2md can also be used as a Python library.
1. Fetch a URL and get Markdown
from extract2md import fetch_to_markdown
markdown = fetch_to_markdown("https://www.iana.org/help/example-domains")
2. Convert a previously saved HTML file
from extract2md import file_to_markdown
markdown_from_file = file_to_markdown("sample-page.html")
3. Convert an HTML string you already have
from extract2md import html_to_markdown
html = "<html><body><h1>Offline HTML</h1></body></html>"
markdown_from_html = html_to_markdown(html)
# Optionally disable replacing relative links with absolute URLs
markdown_custom = html_to_markdown(
html,
rewrite_relative_urls=False,
)
# Or replace relative links with a custom base URL
markdown_custom = html_to_markdown(
html,
rewrite_relative_urls=False,
base_url="https://example.com/docs/",
)
# Pick an alternate conversion backend (e.g., Readability)
markdown_readability = html_to_markdown(html, converter="readability")
Additional public methods
Need to store markup or run your own converter? Use fetch and skip the Markdown
step entirely:
from extract2md import fetch
raw_html, content_type = fetch("https://example.com/docs")
Notes
- The CLI and library both fetch live webpages from URLs; network availability and site rate limits apply.
- Inspired by the Fetch MCP Server.
- Thanks go to these libraries for the heavy lifting:
- ReadabiliPy with Mozilla's Readability.js Node.js package
- Markdownify
- Trafilatura
Metadata
Release files for extract2md 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| extract2md-0.1.2.tar.gz | 13.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| extract2md-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.7 kB
Release files / extract2md-0.1.2.tar.gz
| Download URL | extract2md-0.1.2.tar.gz |
|---|---|
| Size | 13.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
25c6dd8f1e7d07c6e803430fdc3db06371490b712e7b05539440732def42ea9d
|
|
BLAKE2b-256 checksum How to use checksums |
d709d7b822410e78a344652d15aad3dd6d8d2a0cac848adbdce3e797de3afb6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 19, 2025.
Transparency logRelease files / extract2md-0.1.2-py3-none-any.whl
| Download URL | extract2md-0.1.2-py3-none-any.whl |
|---|---|
| Size | 12.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f0217dd664b2a3f7436bf66824f3790270174283049539cdab553aab25e3ac98
|
|
BLAKE2b-256 checksum How to use checksums |
1fc18c705859b511d2d3c0d345163205c2ce74e41d27337d23dc580cf22277c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 19, 2025.
Transparency logSecurity for extract2md 0.1.2
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for extract2md-0.1.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 19, 2025.
Transparency logA 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.