Blog · BL-05
Why Reddit Comment Collection Is Incomplete: Don't Treat MoreComments as Empty Data
Explain Reddit comment trees, the meaning of limit in PRAW replace_more, unexpanded placeholders, and comment count discrepancies, and learn how to pass collection gaps, reply relationships, and deletion handling into analytical results.
A lack of errors during Reddit comment collection does not mean the entire comment tree has been read. When using PRAW, MoreComments represents a pending position to expand, not a comment with empty body text; replace_more(limit=0) removes these placeholders rather than canceling collection volume limits. This detail is enough to make a seemingly clean export miss entire discussions.
In the r/redditdev original discussion, PrincessYukon traced tree expansion, response structure, and authentication header errors to fetch comments for a post. What makes this case worth referencing is not copying old requests, but the troubleshooting approach: verify the exact data received first, then discuss traversal algorithms.
This article checks PRAW author documentation and official Reddit rules as of 2026-9-5, discussing how authorized data collection declares completeness. It runs no real post collection and does not describe old forum incidents as current interface problems.
Why Comment Trees Are Not a Pagination Problem
Many list interfaces allow sequential reading page by page via a cursor chain. However, discussion sections contain deeper replies under specific comments in addition to more comments at the same level. If you only traverse the top-level array, you may capture only the beginning of each discussion; if you skip objects without body, the program will not even warn you about unexpanded parts.
The PRAW comment extraction tutorial maps MoreComments to "load more comments" and "continue this thread" on the page. A single expansion may also reveal new pending positions. Therefore, node counts and request counts are not directly interchangeable: handling ten placeholders does not mean obtaining only ten comments, nor does it mean covering ten complete threads.
When writing parsers, the first step should distinguish body nodes from pending expansion nodes. Unloaded subtrees are "not yet observed," not "nobody replied." This distinction is especially important at the analysis layer: if unexpanded items are deep debates, the distribution of top-level opinions may not represent the entire discussion.
What replace_more limit Actually Restricts
According to current PRAW tutorials, default calls replace up to 32 instances of MoreComments; limit=0 removes placeholders without continuing expansion, while limit=None imposes no upper limit on replacements but remains subject to other conditions. These are not three similar performance options, but three different sampling results.
For example, a quick preview can explicitly choose not to expand, displaying already loaded content. This is a reasonable product feature, except the button should be called "preview loaded comments" rather than "export all comments." When broader scope is needed, a bounded expansion budget can be set; upon reaching the budget, partial results are delivered and this decision is recorded.
None is also not an unlimited work permit for production systems. Tasks still require their own maximum runtime, error stop conditions, and authorized request scopes. Content not returned or inaccessible by the interface will not automatically appear simply because the SDK quantity limit is removed.
threshold should also be explicitly recorded. According to the CommentForest method description, it affects which placeholders get expanded. If readers remember only one "full grab" parameter while ignoring another filter condition, they may still prematurely declare completion.
Save Unexpanded Items Rather Than Relying Solely on Final Arrays
replace_more returns a list of MoreComments instances that were not replaced. Once they are removed from the current tree, placeholders may no longer appear in the final array by themselves; thus, "the final list has no MoreComments" cannot independently prove zero omissions. Unreplaced items returned by the method should be included in task results.
Another precision trap to avoid here: having 5 unexpanded placeholders does not equal missing 5 comments. A single placeholder may represent a subtree, and further expansion could yield even more placeholders. Externally, you can state that "5 unexpanded positions remain," but you should not casually calculate a completion rate.
We recommend that tasks output at least three sets of information: loaded unique comments, uncompleted scope, and stop reasons. Stop reasons can include active preview selection, exhausted expansion budgets, rate limiting, authentication failure, or parsing exceptions. Applications decide how to name fields; the key is that downstream systems can distinguish "no results" from "incomplete execution."
If utilizing third-party wrapper interfaces, you should also ask whether their "comment count" refers to the top-level count, the count across all loaded levels, or a task's trimmed count. Parameter names sharing limit do not imply the same meaning; do not apply PRAW parameter interpretations to EveryInfra or other interfaces.
Keep Track of Comment Reply Targets After Flattening
CommentForest's list() can expand loaded content in traversal order, but flattening is not additional data backfilling. Once a one-dimensional array is obtained, comment IDs, post associations, and parent relationships should not be discarded.
Imagine a top-level comment saying "the new release fixes the issue," followed by a reply stating "desktop only, mobile lacks it." If the export retains only the second sentence, models might treat it as a new standalone complaint; if even the parent comment is missing, context gaps should be flagged rather than letting models guess the preceding text.
Deduplication must also center on identity. If the same comment reappears after a retry, update the current observation instead of turning it into another user's opinion. Even if texts match, different comments cannot be merged solely on string equality. Retain separate states for content edits, missing author info, and invisible parent nodes rather than turning them all into empty strings.
These records are maintained only within applicable data use and retention scopes; relationship retention suggestions do not grant permission to store all raw text permanently.
Counts, Permissions, and Deletions Are Part of Analytical Scope
PRAW tutorials note that post num_comments counts may include deleted, removed, or spam comments, meaning they do not guarantee consistency with extractable quantities. This count can serve as a verification clue, but cannot be treated as a target that must be matched via retries.
Collection permissions must be verified independently. Reddit's Data API Wiki requires applicable OAuth credentials and a clear User-Agent, listing rate-limiting response headers and access rules. Being able to install PRAW does not equal authorization to use data for arbitrary projects; code that runs in old posts cannot replace today's integration conditions.
The same official page requires handling content already deleted on the platform. For an analytical system, this means deletion cannot stop at raw tables: if text has entered search indexes, caches, or other derivative storage, applicable cleanup requirements should be checked there too. Do not retain content explicitly requested for deletion by officials under the pretext of "anonymization."
This affects reproducibility design. A safer goal is to retain permissible methods and task scopes rather than promising permanent preservation of every observed raw text. Research conclusions need to state collection dates and sample scopes, and historical text currently unavailable cannot be treated as indefinitely re-verifiable evidence.
How to Validate a Reddit Comment Export
First, check three counter-examples on synthetic trees: a top-level node with unexpanded subtrees; two different comments sharing identical text; and the same comment entering results multiple times. Correct implementations should respectively preserve uncompleted states, keep two identities, and merge duplicate identities instead of relying on "no program exceptions" to judge success.
Next, inspect stop results for bounded tasks. Reaching an expansion budget should indicate partial completion, credential invalidity should mean authentication failure, and unexpected response structures should point to parsing failure. The three must not all return empty lists. General error classifications can reference local API error handling, but platform response details remain governed by current interfaces.
Finally, check report phrasing: which posts results came from, why those posts were chosen, how far expansion reached, and whether uncompleted items remain. If only a few popular posts were collected, you cannot conclude that "Reddit users generally believe." The local multi-platform sentiment monitoring blueprint similarly separates collection coverage from business judgment.
Reliable Reddit comment data does not need to pretend gaps do not exist. It requires making gaps visible, keeping parent-child relationships traceable, and enforcing usage scopes alongside deletion requests. This ensures subsequent analyses know which judgments are grounded and where unknowns should still be preserved.