From 6efcce459de3e28e4fb87a303aa0ab12fe0ca290 Mon Sep 17 00:00:00 2001 From: Manohar Paturi <186662190+ManoharPaturi@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:33:41 +0530 Subject: [PATCH 1/2] fix(rss): emit item and entry links as heading anchors RSS items and Atom entries carry a (or Atom ), but the converter never read it: the markdown ended up with bare titles and no way to reach the post. Emit the title as a markdown link to the resolved URL instead (relative hrefs resolve against the feed URL). Signed-off-by: Manohar Paturi <186662190+ManoharPaturi@users.noreply.github.com> --- .../markitdown/converters/_rss_converter.py | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/markitdown/src/markitdown/converters/_rss_converter.py b/packages/markitdown/src/markitdown/converters/_rss_converter.py index ce768b8473..5389def46f 100644 --- a/packages/markitdown/src/markitdown/converters/_rss_converter.py +++ b/packages/markitdown/src/markitdown/converters/_rss_converter.py @@ -180,9 +180,13 @@ def _parse_atom_type( entry_summary, summary_is_markup = self._get_atom_content(entry, "summary") entry_updated = self._get_flattened_text(entry, "updated") entry_content, content_is_markup = self._get_atom_content(entry, "content") + entry_link = self._get_entry_link(entry, base_url=doc.documentURI or "") if entry_title: - md_text += f"\n## {entry_title}\n" + heading = f"## {entry_title}" + if entry_link: + heading = f"[{entry_title}]({entry_link})" + md_text += f"\n{heading}\n" if entry_updated: md_text += f"Updated on: {entry_updated}\n" body_parts = ( @@ -208,6 +212,19 @@ def _parse_atom_type( title=title, ) + def _get_entry_link(self, entry: Element, *, base_url: str) -> str | None: + """Return the entry's own URL: an Atom , or an RSS 's text.""" + if entry.namespaceURI == ATOM_NAMESPACE: + node = self._get_child(entry, "link") + if node is None: + return None + href = (node.getAttribute("href") or "").strip() + return _resolve_url(base_url, href) if href else None + text = self._get_flattened_text(entry, "link") + if not text: + return None + return _resolve_url(base_url, text.strip()) + def _get_atom_content( self, entry: Element, tag_name: str ) -> tuple[Union[str, None], bool]: @@ -308,9 +325,13 @@ def _parse_rss_type( description = self._get_data_by_tag_name(item, "description", kind="html") pubDate = self._get_flattened_text(item, "pubDate") content = self._get_data_by_tag_name(item, "content:encoded", kind="html") + item_link = self._get_entry_link(item, base_url=doc.documentURI or "") if title: - md_text += f"\n## {title}\n" + heading = f"## {title}" + if item_link: + heading = f"[{title}]({item_link})" + md_text += f"\n{heading}\n" if pubDate: md_text += f"Published on: {pubDate}\n" body_parts = ( From 40d6912b839c302ae5c93a7bd30d635896ffce10 Mon Sep 17 00:00:00 2001 From: Manohar Paturi <186662190+ManoharPaturi@users.noreply.github.com> Date: Sat, 19 Sep 2026 23:07:55 +0530 Subject: [PATCH 2/2] fix(rss): keep the heading marker when an item link is present Signed-off-by: Manohar Paturi <186662190+ManoharPaturi@users.noreply.github.com> --- packages/markitdown/src/markitdown/converters/_rss_converter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/markitdown/src/markitdown/converters/_rss_converter.py b/packages/markitdown/src/markitdown/converters/_rss_converter.py index 5389def46f..b234fe4cdc 100644 --- a/packages/markitdown/src/markitdown/converters/_rss_converter.py +++ b/packages/markitdown/src/markitdown/converters/_rss_converter.py @@ -185,7 +185,7 @@ def _parse_atom_type( if entry_title: heading = f"## {entry_title}" if entry_link: - heading = f"[{entry_title}]({entry_link})" + heading = f"## [{entry_title}]({entry_link})" md_text += f"\n{heading}\n" if entry_updated: md_text += f"Updated on: {entry_updated}\n"