<?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: Yanqiang Yu</title>
    <description>The latest articles on DEV Community by Yanqiang Yu (@yanqiangyu).</description>
    <link>https://dev.to/yanqiangyu</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%2F4244118%2F047d7cc4-9247-462f-a138-91c541ce0506.jpg</url>
      <title>DEV Community: Yanqiang Yu</title>
      <link>https://dev.to/yanqiangyu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yanqiangyu"/>
    <language>en</language>
    <item>
      <title>How I Built a 100% Local Chrome Extension That Turns Repeating DOM Cards into CSV &amp; JSON</title>
      <dc:creator>Yanqiang Yu</dc:creator>
      <pubDate>Sat, 14 Nov 2026 08:05:01 +0000</pubDate>
      <link>https://dev.to/yanqiangyu/how-i-built-a-100-local-chrome-extension-that-turns-repeating-dom-cards-into-csv-json-3ol4</link>
      <guid>https://dev.to/yanqiangyu/how-i-built-a-100-local-chrome-extension-that-turns-repeating-dom-cards-into-csv-json-3ol4</guid>
      <description>&lt;p&gt;Most web scrapers make a strange trade-off: to grab a pricing table or a list of 40 items on a page you're already viewing, they upload your DOM to a remote server, charge a monthly subscription, and still fail whenever the data sits behind a login or uses &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; cards instead of &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wanted something much simpler—so I built &lt;strong&gt;&lt;a href="https://sheetsnap.joyflow.cloud" rel="noopener noreferrer"&gt;SheetSnap&lt;/a&gt;&lt;/strong&gt; (&lt;a href="https://github.com/ztyqqq808-lab/sheetsnap" rel="noopener noreferrer"&gt;GitHub source&lt;/a&gt;): a 100% local-first Manifest V3 Chrome extension + live browser sandbox that turns messy HTML &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; elements and repeating DOM cards into clean, deduplicated &lt;strong&gt;CSV, JSON, and Markdown&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Try the live parser right in your browser with zero install:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://sheetsnap.joyflow.cloud" rel="noopener noreferrer"&gt;sheetsnap.joyflow.cloud&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why HTML &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; Parsers Miss Most of the Modern Web
&lt;/h2&gt;

&lt;p&gt;Almost nobody builds directories, SaaS pricing matrices, product catalogs, or CRM views with semantic &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; tags anymore. They use Flex and Grid cards:&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="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;article&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Acme Payroll&lt;span class="nt"&gt;&amp;lt;/h3&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="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"price"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$49/mo&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="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"badge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;SOC2&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- repeated 30x --&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;If an extension only checks &lt;code&gt;document.querySelectorAll("table")&lt;/code&gt;, it finds &lt;strong&gt;0 tables&lt;/strong&gt; on most modern web apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Local Repeating-Card Clustering Works
&lt;/h2&gt;

&lt;p&gt;Instead of shipping raw HTML to an LLM or remote parser, SheetSnap runs three fast heuristics directly inside the active browser tab:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Table Extraction&lt;/strong&gt; — Parses &lt;code&gt;&amp;lt;thead&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt; structures cleanly, handling multi-line cell text cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sibling Cluster Detection&lt;/strong&gt; — Walks visible containers with 3+ structurally similar direct children (matching tag signatures &amp;amp; normalized class patterns), then inspects repeated child positions (headings, links, prices, badges) to synthesize columns automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-Side Deduplication + Excel-Safe Export&lt;/strong&gt; — Drops duplicate rows, tracks duplicates removed, prepends a UTF-8 BOM (&lt;code&gt;\uFEFF&lt;/code&gt;) so Excel renders currency &amp;amp; international text without garbling characters, and lets you export &lt;strong&gt;CSV&lt;/strong&gt;, &lt;strong&gt;JSON&lt;/strong&gt;, or &lt;strong&gt;Markdown&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installing &amp;amp; Testing Locally (No Cloud Account Required)
&lt;/h2&gt;

&lt;p&gt;You can test the parser immediately in the &lt;strong&gt;&lt;a href="https://sheetsnap.joyflow.cloud" rel="noopener noreferrer"&gt;Web Sandbox&lt;/a&gt;&lt;/strong&gt; by pasting any HTML snippet or loading the built-in presets (&lt;code&gt;Repeating DOM Cards&lt;/code&gt;, &lt;code&gt;Pricing Grid&lt;/code&gt;, &lt;code&gt;Messy Directory Table&lt;/code&gt;), or load the Chrome Extension unpacked in 30 seconds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download &lt;a href="https://sheetsnap.joyflow.cloud/sheetsnap-extension.zip" rel="noopener noreferrer"&gt;&lt;code&gt;sheetsnap-extension.zip&lt;/code&gt;&lt;/a&gt; (or grab &lt;a href="https://github.com/ztyqqq808-lab/sheetsnap/releases/tag/v1.0.0" rel="noopener noreferrer"&gt;v1.0.0 on GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;chrome://extensions&lt;/code&gt; -&amp;gt; enable &lt;strong&gt;Developer mode&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Load unpacked&lt;/strong&gt; and select the unzipped folder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Free tier includes unlimited sandbox usage and up to 25 rows per extension export; a &lt;strong&gt;$9.90 one-time&lt;/strong&gt; Pro license unlocks unlimited rows across 3 browsers.&lt;/p&gt;

&lt;p&gt;And if you need a &lt;strong&gt;bespoke Chrome extension or paginated scraper&lt;/strong&gt; built around a specific website in 48 hours, I also offer fixed-price builds on &lt;a href="https://sheetsnap.joyflow.cloud" rel="noopener noreferrer"&gt;sheetsnap.joyflow.cloud&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feedback on tricky DOM layouts or edge cases is very welcome in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>chrome</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
