@extractus/article-extractor

中文文档
9.0.1发布于 2026/08/20MITTypeScriptESM + CJS近 30 天下载 14.5万

从给定的 URL 提取主要文章

中文使用文档
文档目录12 节
  1. 安装
  2. 德诺
  3. 节点.js / Bun
  4. 使用量
  5. APIs 密码
  6. extract()
  7. extractFromHtml()
  8. 转换
  9. 内容消毒选项
  10. 发展
  11. 许可证
  12. 支持项目

@ extractus/ article- extractor

从 URL 中提取主文章,主图像和元数据 .

JSR npm version CI test

安装

德诺

deno add jsr:@extractus/article-extractor

节点.js / Bun

pnpm add jsr:@extractus/article-extractor
# or
npx jsr add @extractus/article-extractor
# or
bunx jsr add @extractus/article-extractor

或者从 npm 安装 :

npm install @extractus/article-extractor
# or
bun add @extractus/article-extractor

使用量

import { extract } from "jsr:@extractus/article-extractor";

const data = await extract("https://example.com/article");
console.log(data);

APIs 密码


extract()

从 URL 或 HTML 字符串中装入并提取文章数据.

语法

extract(input: string): Promise<ArticleData | null>
extract(input: string, parserOptions?: ParserOptions): Promise<ArticleData | null>
extract(input: string, parserOptions?: ParserOptions, fetcher?: Fetcher): Promise<ArticleData | null>

示例

import { extract } from "jsr:@extractus/article-extractor";

try {
  const article = await extract("https://example.com/some-article");
  console.log(article);
} catch (err) {
  console.error(err);
}

结果是 null (当找不到文章时)或 ArticleData 对象 :

interface ArticleData {
  url?: string;           // best resolved URL
  links?: string[];       // alternative URLs (canonical, shortlink, amphtml)
  title?: string;         // article title
  description?: string;   // short description / excerpt
  image?: string;         // main image URL
  favicon?: string;       // site favicon URL
  author?: string;        // author name
  content?: string;       // extracted article HTML
  source?: string;        // original publisher domain
  published?: string;     // publication date string
  ttr?: number;           // estimated time to read (seconds), 0 = unknown
  type?: string;          // page type (e.g. "article")
}

参数

input 所需经费

URL 字符串或原始 HTML 内容.

parserOptions 选项
财产类型默认说明
wordsPerMinutenumber300每分钟读取时间估计的单词
descriptionTruncateLennumber210生成描述的最大字符
descriptionLengthThresholdnumber180要保留元描述的最小字符
contentLengthThresholdnumber200文章内容的最小字符
allowedTagsstring[](语义/内容标记)要保持输出的 HTML 标记
allowedAttributesRecord<string, string[]>(src, href, alt等)要保存的相加属性
allowedIframeDomainsstring[](youtube, vimeo等Iframe src 允许域
const article = await extract(url, {
  descriptionLengthThreshold: 120,
  contentLengthThreshold: 500,
});
fetcher 选项

带有签名的自定义获取函数 (url: string) => Promise<Response>。 。 。 . 使用此功能来自定义 HTTP 行为: 代理,信头, TLS, 认证, 超时等.

默认为 globalThis.fetch。 。 。 .

德诺 (带有代理) :

import { extract } from "@extractus/article-extractor";

const client = Deno.createHttpClient({
  proxy: { url: "http://proxy.example.com:8080" },
});
const myFetcher = (url: string) => fetch(url, { client });

const result = await extract("https://example.com/some-article", {}, myFetcher);

节点.js (通过undici使用代理) :

import { extract } from "@extractus/article-extractor";
import { fetch, ProxyAgent } from "undici";

const dispatcher = new ProxyAgent("http://proxy.example.com:8080");
const myFetcher = (url: string) => fetch(url, { dispatcher });

const result = await extract("https://example.com/some-article", {}, myFetcher);

阿宝 (带有代理) :

import { extract } from "@extractus/article-extractor";

const myFetcher = (url: string) =>
  fetch(url, {
    proxy: "http://proxy.example.com:8080",
  });

const result = await extract("https://example.com/some-article", {}, myFetcher);

自定义信头数字 :

const myFetcher = (url: string) =>
  fetch(url, {
    headers: {
      "user-agent": "MyBot/1.0",
      authorization: "Bearer token123",
    },
  });

const result = await extract("https://example.com/some-article", {}, myFetcher);

请求超时数字 :

const myFetcher = (url: string) =>
  fetch(url, {
    signal: AbortSignal.timeout(5000),
  });

const result = await extract("https://example.com/some-article", {}, myFetcher);

extractFromHtml()

从 HTML 字符串直接提取文章数据 .

语法

extractFromHtml(html: string): Promise<ArticleData | null>
extractFromHtml(html: string, url?: string): Promise<ArticleData | null>
extractFromHtml(html: string, url?: string, parserOptions?: ParserOptions): Promise<ArticleData | null>

示例

import { extractFromHtml } from "jsr:@extractus/article-extractor";

const res = await fetch(url);
const html = await res.text();

const article = await extractFromHtml(html, url);

参数

html 所需经费

包含文章的 HTML 字符串 .

url 选项

用于解析相对链接的源 URL.

parserOptions 选项

见 解析选项 见上文.


转换

有时默认提取算法可能效果不佳. 变换让您每个站点加入前/后处理.

  • addTransformations(transformation: Transformation | Transformation[]): number
  • removeTransformations(patterns?: RegExp[]): number

Transformation 对象

interface Transformation {
  patterns: RegExp[];                        // URL patterns to match
  pre?: (document: Document) => Document;    // pre-process raw HTML
  post?: (document: Document) => Document;   // post-process extracted article
}

对于匹配的 URL patterns运行 pre ,取出文章,然后运行 post 在结果.

extraction process

示例

import { addTransformations } from "jsr:@extractus/article-extractor";

addTransformations({
  patterns: [/([\w]+.)?domain\.tld\/*/],
  pre: (document) => {
    document.querySelectorAll(".advertise-area").forEach((el) => {
      el.parentNode?.removeChild(el);
    });
    return document;
  },
  post: (document) => {
    document.querySelectorAll("h4").forEach((el) => {
      const h2 = document.createElement("h2");
      h2.innerHTML = el.innerHTML;
      el.parentNode?.replaceChild(h2, el);
    });
    return document;
  },
});

要写更好的转换,请参考 链接 编辑 API 文档。 。 。 .

addTransformations(transformation | Transformation[])

添加单个或多个变换. 无转换 patterns 被忽略.

import { addTransformations } from "jsr:@extractus/article-extractor";

addTransformations([
  {
    patterns: [/([\w]+.)?abc\.tld\/*/],
    pre: (doc) => { /* ... */ return doc; },
    post: (doc) => { /* ... */ return doc; },
  },
  {
    patterns: [/([\w]+.)?xyz\.tld\/*/],
    post: (doc) => { /* ... */ return doc; },
  },
]);

removeTransformations(patterns?: RegExp[])

删除匹配给定模式的转换 。 调用无参数删除全部 .

import { removeTransformations } from "jsr:@extractus/article-extractor";

removeTransformations([
  /([\w]+.)?abc\.tld\/*/,
  /([\w]+.)?xyz\.tld\/*/,
]);

优先权顺序

当多个转换相匹配时,它们都按顺序执行.

鉴于两个匹配的转换 goo.gl数字 :

pre_one -> pre_three -> extraction -> post_two -> post_four

内容消毒选项

取出HTML使用内置的DOM树行走器进行消毒. 被丢弃的标签被取出(没有被丢弃),被丢弃的属性被取出. 通过 parserOptions数字 :

import { extract } from "jsr:@extractus/article-extractor";

// allow class attributes on <code> and <div>
const article = await extract(url, {
  allowedAttributes: {
    a: ["href", "target", "title"],
    img: ["src", "srcset", "alt", "title"],
    code: ["class"],
    div: ["class"],
  },
});

查看全部默认值,参见 src/config.ts。 。 。 .


发展

git clone https://github.com/extractus/article-extractor.git
cd article-extractor

# run tests
deno test --allow-all

# lint
deno lint

# build npm package
deno run -A ./scripts/build_npm.ts

许可证

《麻省理工学院许可证》

支持项目

这个项目是我空余时间维持的 如果你认为这有帮助, 有一些简单的方式支持它的持续发展:

每一点支持都有助于保持该项目的积极维持。 谢谢


版本与发布记录

@extractus/article-extractor 共发布 42 个版本,首次发布于 2022/11/29;过去 12 个月发布了 3 个版本。

版本发布日期距今
9.0.1latest2026/08/202 个月前
9.0.02026/08/063 个月前
8.1.02026/05/036 个月前
8.0.202025/09/041.2 年前
8.0.192025/05/141.5 年前
8.0.182025/05/041.5 年前

关于 @extractus/article-extractor 的常见问题

@extractus/article-extractor 是什么?

从给定的 URL 提取主要文章

如何安装 @extractus/article-extractor?

在项目目录运行 npm install @extractus/article-extractor,或使用 pnpm add / yarn add / bun add。

@extractus/article-extractor 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@extractus/article-extractor 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@extractus/article-extractor 可以商用吗?

@extractus/article-extractor 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@extractus/article-extractor 的下载量有多少?

根据 npm 官方下载统计,@extractus/article-extractor 在 2026/10/14 – 2026/11/12 这 30 天内被下载 145,327 次,日均约 4,844 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@extractus/article-extractor 还在维护吗?

最新版本 9.0.1 发布于 2026/08/20(2 个月前);至今共发布 42 个版本,其中过去 12 个月发布了 3 个;首次发布于 2022/11/29。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。