<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: XSron Hou</title>
    <description>The latest articles on DEV Community by XSron Hou (@xsron_hou_9dc0afce46615a8).</description>
    <link>https://dev.to/xsron_hou_9dc0afce46615a8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4064545%2F3e1146b6-e88e-4c92-9707-fea84fd17040.png</url>
      <title>DEV Community: XSron Hou</title>
      <link>https://dev.to/xsron_hou_9dc0afce46615a8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xsron_hou_9dc0afce46615a8"/>
    <language>en</language>
    <item>
      <title>Why Markdown Is Better Than HTML for LLM Context Windows</title>
      <dc:creator>XSron Hou</dc:creator>
      <pubDate>Wed, 05 Aug 2026 15:43:09 +0000</pubDate>
      <link>https://dev.to/xsron_hou_9dc0afce46615a8/why-markdown-is-better-than-html-for-llm-context-windows-3ej6</link>
      <guid>https://dev.to/xsron_hou_9dc0afce46615a8/why-markdown-is-better-than-html-for-llm-context-windows-3ej6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted on the &lt;a href="https://scrapio.dev/blog/markdown-from-website-for-llm" rel="noopener noreferrer"&gt;Scrapio blog&lt;/a&gt; — sharing here too.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you're building a RAG pipeline or an LLM agent that reads web pages, the format you put into the context window matters more than most people realize. Raw HTML and clean markdown can represent the same information, but one costs 10× more in tokens and adds substantial noise that degrades model performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with HTML
&lt;/h2&gt;

&lt;p&gt;A typical product page might have 3,000 words of actual content. As raw HTML, that page is often 50,000–80,000 characters — mostly tags, class names, JavaScript, tracking pixels, and navigation menus.&lt;/p&gt;

&lt;p&gt;LLMs tokenize all of it. You pay for every &lt;code&gt;&amp;lt;div class="product-carousel__item--highlighted"&amp;gt;&lt;/code&gt; even though it carries no information your model needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measured comparison
&lt;/h2&gt;

&lt;p&gt;We ran 100 pages through both approaches and measured:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Raw HTML&lt;/th&gt;
&lt;th&gt;Clean Markdown&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Avg tokens per page&lt;/td&gt;
&lt;td&gt;18,400&lt;/td&gt;
&lt;td&gt;1,850&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokens that are content&lt;/td&gt;
&lt;td&gt;~12%&lt;/td&gt;
&lt;td&gt;~94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4o cost per 1,000 pages&lt;/td&gt;
&lt;td&gt;~$91&lt;/td&gt;
&lt;td&gt;~$9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extraction accuracy (structured tasks)&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;td&gt;89%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The accuracy difference is real: LLMs perform better when they're not trying to reason through a wall of HTML noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What clean markdown looks like
&lt;/h2&gt;

&lt;p&gt;Raw HTML snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pdp-price-container"&lt;/span&gt; &lt;span class="na"&gt;data-testid=&lt;/span&gt;&lt;span class="s"&gt;"price-wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"price--sale"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Sale price"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"price__currency"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"price__amount"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;279&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"price__cents"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;.99&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same content as markdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Price:** $279.99
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The markdown version is 22 tokens. The HTML version is 89 tokens — and that's a small excerpt. An entire page compounds this by 50–100×.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting clean markdown from any URL
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.scrapio.dev/v1/fetch &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk-..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"url": "https://example.com/article", "output": ["markdown"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"req_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"# Article Title&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Content here..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"credits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;markdown&lt;/code&gt; output strips navigation, ads, scripts, and layout elements. What remains is the readable content — headings, paragraphs, lists, tables, and code blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript-rendered pages
&lt;/h2&gt;

&lt;p&gt;SPAs and dynamic pages need a render step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/dashboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"render_js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;render_js&lt;/code&gt;, you'd get the pre-hydration HTML — often an empty shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  For RAG pipelines
&lt;/h2&gt;

&lt;p&gt;When crawling large sites for a vector database, markdown is especially important because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chunking is cleaner&lt;/strong&gt; — markdown structure (headings, paragraphs) provides natural split points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embeddings are better&lt;/strong&gt; — semantic models trained on clean text produce better vectors when the input isn't polluted with HTML syntax&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage is cheaper&lt;/strong&gt; — 10× smaller documents mean lower storage and fewer API calls to retrieve them&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Try the &lt;a href="https://scrapio.dev/templates/webpage-to-markdown" rel="noopener noreferrer"&gt;Webpage to Markdown template&lt;/a&gt; for a copy-paste implementation&lt;/li&gt;
&lt;li&gt;See &lt;a href="https://scrapio.dev/templates/batch-article-extractor" rel="noopener noreferrer"&gt;Batch Article Extractor&lt;/a&gt; for crawling and indexing entire sites&lt;/li&gt;
&lt;li&gt;Read &lt;a href="https://scrapio.dev/blog/feed-live-website-data-into-llm-agent" rel="noopener noreferrer"&gt;How to Feed Live Website Data into an LLM Agent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webscraping</category>
      <category>ai</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
