{
 "title": "Clean Web Clipper extraction benchmark",
 "about": "How much of a web page survives as clean Markdown, measured on live top sites with the competing engines named and versioned. Aggregates only: no captured third-party HTML.",
 "disclosure": "Written and run by the author of Clean Web Clipper.",
 "sources": [
  "bench/README.md",
  "bench/BENCH.md (Итог после доводки, 109 страниц)",
  "bench/pages-eu/score-eu.json"
 ],
 "total_pages": 512,
 "summary": "512 pages: 109 head-to-head against three other engines plus 403 through the Clean Web Clipper core only. 0 crashes and 0 leftover HTML tags in any extracted article. Head-to-head: 102 duplicated menu lines against 282-491 for the others.",
 "engines": [
  {
   "name": "Defuddle",
   "version": "0.19.3",
   "ran": "defuddle + Turndown 7.2.4 + turndown-plugin-gfm 1.0.2",
   "source": "https://github.com/kepano/defuddle"
  },
  {
   "name": "Mozilla Readability",
   "version": "0.6.0",
   "ran": "@mozilla/readability + Turndown 7.2.4",
   "source": "https://github.com/mozilla/readability"
  },
  {
   "name": "MarkSnip",
   "version": "5.2.0",
   "ran": "shipped extension code (Readability.js, turndown.js, GFM plugin, turndown() from offscreen.js) in a Node vm sandbox",
   "source": "https://chromewebstore.google.com/detail/kcbaglhfgbkjdnpeokaamjjkddempipm"
  },
  {
   "name": "Clean Web Clipper",
   "version": "0.1.0",
   "ran": "clipper/src/core, core as of 2026-08-31"
  }
 ],
 "runtime": {
  "node": "24",
  "jsdom": "29.1.1",
  "playwright": "1.62.1"
 },
 "runs": {
  "head_to_head": {
   "captured": "2026-08-30",
   "corpus": "World top 100 (Similarweb, May 2026) and Runet top 100 (Similarweb / Semrush / Mediascope, 2026)",
   "captured_pages": 135,
   "dropped": {
    "pages": 26,
    "reason": "every engine returned under 500 characters (blocks, captchas)"
   },
   "pages": 109,
   "metrics": {
    "pages_with_output": {
     "Defuddle": 109,
     "Mozilla Readability": 107,
     "MarkSnip": 107,
     "Clean Web Clipper": 109
    },
    "crashes": {
     "Defuddle": 0,
     "Mozilla Readability": 2,
     "MarkSnip": 2,
     "Clean Web Clipper": 0
    },
    "leftover_html_tags": {
     "Defuddle": 532,
     "Mozilla Readability": 718,
     "MarkSnip": 2,
     "Clean Web Clipper": 0
    },
    "duplicated_lines": {
     "Defuddle": 491,
     "Mozilla Readability": 282,
     "MarkSnip": 478,
     "Clean Web Clipper": 102
    },
    "short_line_ratio": {
     "Defuddle": 0.278,
     "Mozilla Readability": 0.262,
     "MarkSnip": 0.263,
     "Clean Web Clipper": 0.221
    },
    "junk_markers": {
     "Defuddle": 23,
     "Mozilla Readability": 34,
     "MarkSnip": 36,
     "Clean Web Clipper": 24
    },
    "useful_text_chars": {
     "Defuddle": 804959,
     "Mozilla Readability": 575165,
     "MarkSnip": 628252,
     "Clean Web Clipper": 712157
    },
    "headings": {
     "Defuddle": 621,
     "Mozilla Readability": 346,
     "MarkSnip": 455,
     "Clean Web Clipper": 526
    },
    "date_found": {
     "Defuddle": 28,
     "Mozilla Readability": 13,
     "MarkSnip": 13,
     "Clean Web Clipper": 24
    },
    "author_found": {
     "Defuddle": 23,
     "Mozilla Readability": 27,
     "MarkSnip": 28,
     "Clean Web Clipper": 28
    },
    "tables_extracted_of_56": {
     "Defuddle": 3,
     "Mozilla Readability": 8,
     "MarkSnip": 11,
     "Clean Web Clipper": 5
    },
    "useful_text_share": {
     "Defuddle": 0.878,
     "Mozilla Readability": 0.931,
     "MarkSnip": 0.934,
     "Clean Web Clipper": 0.89
    }
   }
  },
  "core_only": {
   "captured": "2026-08-31",
   "corpus": "Top 50 sites of each country for de, fr, es, it, nl, pl, pt_BR, ro, sv, tr, uk, cs, captured with the browser set to the country's language",
   "attempted": 518,
   "pages": 403,
   "crashes": 0,
   "no_article": 152,
   "leftover_html_tags": 0,
   "duplicated_lines": 242,
   "duplicated_lines_note": "counted on articles only, without table and code lines – a different rule from head_to_head; do not add or compare",
   "per_language": {
    "de": {
     "pages": 40,
     "fail": 0,
     "noArticle": 17,
     "raw": 0,
     "dup": 70,
     "shortRatio": 0.213,
     "linkShare": 0.058,
     "headings": 294,
     "date": 12,
     "author": 11,
     "footnotes": 0,
     "avgChars": 13354
    },
    "fr": {
     "pages": 39,
     "fail": 0,
     "noArticle": 19,
     "raw": 0,
     "dup": 25,
     "shortRatio": 0.187,
     "linkShare": 0.05,
     "headings": 144,
     "date": 7,
     "author": 3,
     "footnotes": 0,
     "avgChars": 13649
    },
    "es": {
     "pages": 40,
     "fail": 0,
     "noArticle": 14,
     "raw": 0,
     "dup": 6,
     "shortRatio": 0.19,
     "linkShare": 0.06,
     "headings": 166,
     "date": 17,
     "author": 17,
     "footnotes": 0,
     "avgChars": 32372
    },
    "it": {
     "pages": 40,
     "fail": 0,
     "noArticle": 12,
     "raw": 0,
     "dup": 8,
     "shortRatio": 0.097,
     "linkShare": 0.036,
     "headings": 174,
     "date": 10,
     "author": 10,
     "footnotes": 0,
     "avgChars": 11316
    },
    "pl": {
     "pages": 30,
     "fail": 0,
     "noArticle": 6,
     "raw": 0,
     "dup": 3,
     "shortRatio": 0.192,
     "linkShare": 0.064,
     "headings": 214,
     "date": 11,
     "author": 13,
     "footnotes": 0,
     "avgChars": 15015
    },
    "pt_BR": {
     "pages": 36,
     "fail": 0,
     "noArticle": 14,
     "raw": 0,
     "dup": 35,
     "shortRatio": 0.236,
     "linkShare": 0.06,
     "headings": 189,
     "date": 8,
     "author": 9,
     "footnotes": 0,
     "avgChars": 5944
    },
    "nl": {
     "pages": 37,
     "fail": 0,
     "noArticle": 19,
     "raw": 0,
     "dup": 43,
     "shortRatio": 0.268,
     "linkShare": 0.049,
     "headings": 96,
     "date": 6,
     "author": 3,
     "footnotes": 0,
     "avgChars": 8653
    },
    "tr": {
     "pages": 31,
     "fail": 0,
     "noArticle": 14,
     "raw": 0,
     "dup": 1,
     "shortRatio": 0.221,
     "linkShare": 0.042,
     "headings": 147,
     "date": 1,
     "author": 5,
     "footnotes": 0,
     "avgChars": 5388
    },
    "uk": {
     "pages": 13,
     "fail": 0,
     "noArticle": 3,
     "raw": 0,
     "dup": 7,
     "shortRatio": 0.204,
     "linkShare": 0.054,
     "headings": 17,
     "date": 4,
     "author": 2,
     "footnotes": 0,
     "avgChars": 7625
    },
    "cs": {
     "pages": 28,
     "fail": 0,
     "noArticle": 12,
     "raw": 0,
     "dup": 2,
     "shortRatio": 0.197,
     "linkShare": 0.039,
     "headings": 85,
     "date": 1,
     "author": 4,
     "footnotes": 0,
     "avgChars": 6283
    },
    "sv": {
     "pages": 28,
     "fail": 0,
     "noArticle": 10,
     "raw": 0,
     "dup": 15,
     "shortRatio": 0.239,
     "linkShare": 0.036,
     "headings": 110,
     "date": 7,
     "author": 6,
     "footnotes": 0,
     "avgChars": 7034
    },
    "ro": {
     "pages": 41,
     "fail": 0,
     "noArticle": 12,
     "raw": 0,
     "dup": 27,
     "shortRatio": 0.169,
     "linkShare": 0.039,
     "headings": 280,
     "date": 10,
     "author": 6,
     "footnotes": 0,
     "avgChars": 10457
    }
   }
  }
 },
 "where_worse": [
  {
   "metric": "tables_extracted_of_56",
   "clean_web_clipper": 5,
   "best": {
    "engine": "MarkSnip",
    "value": 11
   }
  },
  {
   "metric": "useful_text_share",
   "clean_web_clipper": 0.89,
   "best": {
    "engine": "MarkSnip",
    "value": 0.934
   }
  },
  {
   "metric": "useful_text_chars",
   "clean_web_clipper": 712157,
   "best": {
    "engine": "Defuddle",
    "value": 804959
   }
  },
  {
   "metric": "headings",
   "clean_web_clipper": 526,
   "best": {
    "engine": "Defuddle",
    "value": 621
   }
  },
  {
   "metric": "date_found",
   "clean_web_clipper": 24,
   "best": {
    "engine": "Defuddle",
    "value": 28
   }
  },
  {
   "metric": "no_article",
   "clean_web_clipper": 152,
   "of": 403,
   "note": "most are feeds, shops and portals; a refusal on a real article is a miss this benchmark does not count separately"
  }
 ],
 "outside_both_runs": {
  "anti_bot": 23,
  "did_not_open": 11
 }
}
