Files
BSN-Chatsystem/parse_reddit2.py

114 lines
4.2 KiB
Python

import re, json
from datetime import datetime, timezone
CUTOFF_MS = 1780272000000 # June 1, 2026 08:00 UTC
files = {
'top': '/home/hermes/workspace/reddit_top.html',
'hot': '/home/hermes/workspace/reddit_hot.html',
'new': '/home/hermes/workspace/reddit_new.html',
}
all_posts = {}
for source, path in files.items():
with open(path) as f:
content = f.read()
# Extract title blocks: <p class="title"> ... </p>
title_blocks = re.findall(r'<p class="title">(.*?)</p>', content, re.DOTALL)
print(f"\n=== {source.upper()} ===")
for block in title_blocks:
# Extract permalink (for self posts) or outbound href
# self post: href="/r/boardgames/comments/..."
permalink_m = re.search(r'href="(/r/boardgames/comments/[^"/]+/)', block)
if not permalink_m:
# alternative: gallery or i.redd.it with data-href-url
permalink_m = re.search(r'href="(/r/boardgames/comments/[^"/]+)"', block)
if not permalink_m:
# outbound: look for data-href-url
permalink_m = re.search(r'data-href-url="([^"]*r/boardgames/comments/[^"]*)"', block)
if not permalink_m:
continue
permalink = permalink_m.group(1)
# Extract title text
title_m = re.search(r'<a[^>]*>(.*?)</a>', block)
title = title_m.group(1).strip() if title_m else 'Unknown'
# Flair
flair_m = re.search(r'title="([^"]*)"', block.split('</a>')[0])
flair = ''
flair_label = re.search(r'linkflairlabel[^>]*title="([^"]*)"', block)
if flair_label:
flair = flair_label.group(1)
# Find data attributes for this post (search nearby in the full content)
# Build a short ID from the permalink
post_id = permalink.split('/comments/')[1].split('/')[0] if '/comments/' in permalink else permalink.split('/')[-2]
# Search for attribute block near this permalink
pattern = re.compile(
r'data-permalink="[^"]*' + re.escape(post_id) + r'[^"]*".*?'
r'(?:data-comments-count="(\d+)".*?)?'
r'(?:data-score="(\d+)".*?)?'
r'(?:data-timestamp="(\d+)".*?)?'
r'(?:data-author="([^"]*)".*?)?',
re.DOTALL
)
attr_match = pattern.search(content)
if attr_match:
comments = int(attr_match.group(1)) if attr_match.group(1) else 0
score = int(attr_match.group(2)) if attr_match.group(2) else 0
timestamp = int(attr_match.group(3)) if attr_match.group(3) else 0
author = attr_match.group(4) or 'unknown'
else:
comments = score = timestamp = 0
author = 'unknown'
if timestamp < CUTOFF_MS:
continue
key = post_id
if key in all_posts:
# Keep highest score
if score > all_posts[key]['score']:
all_posts[key] = {
'title': title,
'flair': flair,
'permalink': permalink,
'source': source,
'score': score,
'comments': comments,
'timestamp': timestamp,
'author': author,
}
else:
all_posts[key] = {
'title': title,
'flair': flair,
'permalink': permalink,
'source': source,
'score': score,
'comments': comments,
'timestamp': timestamp,
'author': author,
}
print(f"\n\n=== TOTAL UNIQUE POSTS (last 72h): {len(all_posts)} ===")
sorted_posts = sorted(all_posts.values(), key=lambda x: x['score'], reverse=True)
for i, p in enumerate(sorted_posts):
dt = datetime.fromtimestamp(p['timestamp']/1000, tz=timezone.utc)
age_h = (datetime.now(timezone.utc) - dt).total_seconds() / 3600
flair_str = f" [{p['flair']}]" if p['flair'] else ""
print(f"{i+1}. [{p['source'].upper()}{flair_str}] Score:{p['score']} 💬{p['comments']} | {age_h:.0f}h ago")
print(f" {p['title']}")
print(f" u/{p['author']} | https://old.reddit.com{p['permalink']}")
print()