from pathlib import Path from bs4 import BeautifulSoup from markdownify import markdownify def code_language(pre): code = pre.find('code') for value in (code or pre).get('class', []): if value.startswith('language-'): return value.removeprefix('language-') return '' soup = BeautifulSoup(Path('input.html').read_text(), 'html.parser') article = soup.select_one('main article') if article is None: raise ValueError('No main article element in this input') Path('output.md').write_text(markdownify( str(article), heading_style='ATX', code_language_callback=code_language))