diff --git a/html2md.py b/html2md.py index 86c9120..1e159bc 100644 --- a/html2md.py +++ b/html2md.py @@ -82,7 +82,7 @@ class SmartMarkdownConverter: def _detect_and_extract(self, soup: BeautifulSoup) -> Tuple[str, any]: """Detect content type and extract structured content.""" - # Forum detection (Discourse, phpBB, vBulletin, etc.) + # Forum detection (Discourse, phpBB, vBulletin, Reddit, etc.) forum_indicators = [ '.post_container', # Discourse archived (has avatar_container + post) '.topic-post', # Discourse live @@ -90,6 +90,11 @@ class SmartMarkdownConverter: '.message', # XenForo '.postcontainer', # vBulletin 'article.boxed', # Generic + '.thing.comment', # Reddit old + 'shreddit-comment', # Reddit new + '.Comment', # Reddit redesign + '.remarkbox-comment', # Remarkbox + '.comment', # Generic comments ] for post_sel in forum_indicators: posts = soup.select(post_sel) @@ -153,7 +158,10 @@ class SmartMarkdownConverter: post.select_one('.avatar-flair img') or post.select_one('.user-avatar img') or post.select_one('.postprofile img') or - post.select_one('.author img') + post.select_one('.author img') or + post.select_one('img[alt*="avatar"]') or # Reddit + post.select_one('.flair img') or # Reddit flair + post.select_one('.remarkbox-avatar img') # Remarkbox ) if avatar: src = avatar.get('src', '') @@ -171,7 +179,10 @@ class SmartMarkdownConverter: post.select_one('a[data-user-card]') or post.select_one('.names .name') or post.select_one('.postprofile dt') or - post.select_one('strong.username') + post.select_one('strong.username') or + post.select_one('a[href*="/user/"]') or # Reddit + post.select_one('a[href*="/u/"]') or # Reddit shorthand + post.select_one('.remarkbox-author') # Remarkbox ) if username_el: post_data['username'] = username_el.get_text(strip=True) @@ -197,7 +208,10 @@ class SmartMarkdownConverter: post.select_one('.post_body') or post.select_one('.entry-content') or post.select_one('.content') or - post.select_one('.post') # Fallback to inner .post div + post.select_one('.post') or # Fallback to inner .post div + post.select_one('.md') or # Reddit markdown content + post.select_one('.usertext-body') or # Reddit old + post.select_one('.remarkbox-content') # Remarkbox ) if content_el: post_data['content'] = self._element_to_markdown(content_el)