- Readability.js๋ Firefox Reader View์์ ์ฐ์ด๋ ๋ณธ๋ฌธ ์ถ์ถ ๋ก์ง์ ๋ ๋ฆฝ ์คํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- DOM ๋ ธ๋๋ฅผ ์ค์ฝ์ด๋งํ๋ ํด๋ฆฌ์คํฑ์ผ๋ก ๊ด๊ณ ยท๋ค๋น๊ฒ์ด์ ยท์ฌ์ด๋๋ฐ๋ฅผ ๊ฑธ๋ฌ๋ด๊ณ ๊ธฐ์ฌ ๋ณธ๋ฌธ๋ง ๋จ๊ธฐ๋ ํ์
new Readability(document).parse()ํ ์ค ํธ์ถ๋ก title/content/textContent/excerpt ๋ฑ์ ๋ฐํํ๋ API
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- HTML์ ๊ทธ๋๋ก chunkํ๋ฉด nav/ads๊ฐ claim ์ถ์ถ ๋์์ ์์ฌ LLM-wiki Ingest flow์ claim ํ์ง์ด ๋จ์ด์ง๋ค
- ๋ณธ๋ฌธ๋ง ๋จ๊ธฐ๋ ๊ฒ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ญํ ์ด๊ณ , ์ ์ ๋ HTML์ markdown์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ Turndown.js๊ฐ ๋ด๋นํ๋ ๋ณ๊ฐ ๋จ๊ณ๋ค
- HTML Ingest ๋ ์ด์ด์ LLM-Wiki ์ ์ฒด ๊ตฌ์กฐ์์๋ ์ด ์กฐํฉ์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ก ์ฐ์ง๋ง, ๋ ์ด์ด ์ธํฐํ์ด์ค(HTML in โ ์ ๊ทํ Markdown + ํด์ out)๋ง ์งํค๋ฉด trafilatura ๊ฐ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ต์ฒดํ ์ ์๋ค
AS-IS
<html>
<nav>...๋ฉ๋ด...</nav>
<aside>...๊ด๊ณ ...</aside>
<article><h1>์ ๋ชฉ</h1><p>๋ณธ๋ฌธ...</p></article>
<footer>...</footer>
</html>์ ์ฒด DOM์ด ๊ทธ๋๋ก chunk ๋์์ด ๋์ด nav/aside/footer๋ claim ํ๋ณด์ ์์ธ๋ค.
TO-BE
const { document } = new JSDOM(rawHtml).window;
const article = new Readability(document).parse();
// article.content: ๋ณธ๋ฌธ HTML๋ง ๋จ์ (nav/aside/footer ์ ๊ฑฐ)
// article.textContent: ๋ณธ๋ฌธ ํ
์คํธ๋งparse() ๊ฒฐ๊ณผ ํ๋
| ํ๋ | ๋ด์ฉ |
|---|---|
title | ๊ธฐ์ฌ ์ ๋ชฉ |
content | ์ ์ ๋ ๋ณธ๋ฌธ HTML |
textContent | ๋ณธ๋ฌธ ์์ ํ ์คํธ |
excerpt | ์์ฝ/์ค๋ช |
byline | ์์ฑ์ ์ ๋ณด |
lang, dir, publishedTime, siteName | ๋ฉํ๋ฐ์ดํฐ |
์ฃผ์ํ ์ 2๊ฐ์ง
parse()๋ ์๋ณธ DOM์ ์ง์ ์์ ํ๋ค โ ์๋ณธ ๋ณด์กด์ด ํ์ํ๋ฉด cloneํ document๋ฅผ ๋๊ฒจ์ผ ํ๋ค- Readability ์์ฒด๋ sanitize๋ฅผ ํ์ง ์๋๋ค โ ์ ๋ขฐํ ์ ์๋ ์ ๋ ฅ(web clipper๋ก ์์ ์ฌ์ดํธ๋ฅผ ์์งํ๋ ๊ฒฝ์ฐ ๋ฑ)์ด๋ฉด DOMPurify ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๋๋ก ํต๊ณผ์์ผ์ผ ํ๋ค