<div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/a6dfb3a3-c366-4aca-91a9-fbd09df15d04.png"/> </div> <!-- 间隔 --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/>import wtf from 'wtf_wikipedia' let doc = await wtf.fetch('Toronto Raptors') let coach = doc.infobox().get('coach') coach.text() //'Darko Rajaković'
获取清洁的纯文本:
let str = `[[Greater_Boston|Boston]]'s [[Fenway_Park|baseball field]] has a {{convert|37|ft}} wall. <ref>Field of our Fathers: By Richard Johnson</ref>` wtf(str).text() // "Boston's baseball field has a 37ft wall."
<div align="right"> <a href="https://observablehq.com/@spencermountain/wtf-wikipedia-text">.text() 文档</a> </div> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/d0d6f410-8ada-4abc-8371-c90cd1932b7c.png"/> </div>let doc = await wtf.fetch('Glastonbury', 'en') doc.sentences()[0].text() // 'Glastonbury是英格兰萨默塞特郡的一个小镇和民政教区,位于一个干燥点...'
获取页面的所有数据:
let doc = await wtf.fetch('Whistling') doc.json() // { categories: ['口头交流', '声音技巧'], sections: [{ title: '技巧' }], ...}
默认的 .json() 输出是_非常详细的_,但你可以像这样挑选数据:
<div align="right"> <a href="https://observablehq.com/@spencermountain/wtf-wikipedia-json">.json() 文档</a> </div> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/a6dfb3a3-c366-4aca-91a9-fbd09df15d04.png"/> </div> <!-- 间隔 --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/>// 只获取链接: doc.links().map((link) => link.json()) //[{ page: '戏剧迷信', text: '迷信' }] // 只获取图片: doc.images()[0].json() // { file: 'Image:Duveneck Whistling Boy.jpg', url: 'https://commons.wiki...' } // 特定章节的json: doc.section('另见').links()[0].json() // { page: '滑哨' }
在客户端运行:
<script src="https://unpkg.com/wtf_wikipedia"></script> <script> wtf.fetch('Radiohead', { 'Api-User-Agent': '在此处命名你的脚本' }, function (err, doc) { let members = doc.infobox().get('current members') members.links().map((l) => l.page()) //['Thom Yorke', 'Jonny Greenwood', 'Colin Greenwood'...] }) </script>
或在服务器端:
<!-- spacer --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/d0d6f410-8ada-4abc-8371-c90cd1932b7c.png"/> </div>import wtf from 'wtf_wikipedia' // 或者, const wtf = require('wtf_wikipedia')
使用这个库,结合 dumpster-dive,你可以在一个下午内解析整个英文维基百科。
<img height="280px" src="https://yellow-cdn.veclightyear.com/835a84d5/5b2ce754-5a66-4591-9380-440a620c4e37.gif"/> <div align="right"> <a href="https://github.com/spencermountain/dumpster-dive/">dumpster 文档</a> </div> <!-- spacer --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/a6dfb3a3-c366-4aca-91a9-fbd09df15d04.png"/> </div>npm install -g dumpster-dive
维基文本 并非小事。
考虑以下几点:
这个库支持许多递归技巧、已弃用和晦涩的模板变体,以及非法的维基简写。
它的构建尽可能灵活。在所有情况下,都尝试以周到的方式处理失败。
<!-- spacer --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/>维基媒体的官方解析器将维基文本转换为 HTML。
<!-- 你甚至可以通过 API 获取 HTML [像这样](https://en.wikipedia.org/w/api.php?format=json&origin=*&action=parse&prop=text&page=Whistling)。 -->如果你更喜欢这种屏幕抓取工作流程,你可以像这样提取页面的各个部分。
这很酷!
但通过这种方式获取结构化数据仍然是一个复杂、奇怪的过程。 手动_探索_ HTML 有时与扫描维基文本本身一样棘手和容易出错。
这个库的贡献者们已经得出这个结论,正如许多其他人一样。
这个库对 Parsoid 的贡献者表示感谢。
<!-- spacer --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/a6dfb3a3-c366-4aca-91a9-fbd09df15d04.png"/> </div>将你的维基文本转换为 Doc 对象
import wtf from 'wtf_wikipedia' let txt = ` ==木材在流行文化中== * 哈利·波特的魔杖 * 辛普森一家的栅栏 ` wtf(txt) // Document {text(), json(), lists()...}
let txt = `口哨在许多电视节目中都有出现,例如 [[Lassie (1954 TV series)|''莱西'']],以及《[[The X-Files|X档案]]》的片头主题。` wtf(txt) .links() .map((l) => l.page()) // [ 'Lassie (1954 TV series)', 'The X-Files' ]
返回文章的纯文本格式
let txt = "[[Greater_Boston|波士顿]]的[[Fenway_Park|棒球场]]有一面 {{convert|37|ft}} 高的墙。<ref>{{cite web|blah}}</ref>" wtf(txt).text() //"波士顿的棒球场有一面 37 英尺高的墙。"
章节是指 '==像这样==' 的标题
wtf(page).sections()[1].children() // 遍历嵌套的章节 wtf(page).section('see also').remove() // 删除一个章节
let s = wtf(page).sentences()[4] s.links() s.bolds() s.italics() s.text() s.wikitext()
await wtf.fetch('Whistling').categories() //['口头交流', '声乐', '声音技巧']
let img = wtf(page).images()[0] img.url() // 完整大小的维基媒体托管的URL img.thumbnail() // 默认300px img.format() // jpg, png, ..
你可以从任何维基API抓取和解析文章。这包括任何语言、任何维基项目,以及大多数第三方维基。
// 第三方维基 let doc = await wtf.fetch('https://muppet.fandom.com/wiki/Miss_Piggy') // 法语维基百科 doc = await wtf.fetch('Tony Hawk', 'fr') doc.sentence().text() // 'Tony Hawk是一名职业滑板运动员和演员...' // 接受数组或维基媒体页面ID let docs = wtf.fetch(['Whistling', 2983], { follow_redirects: false }) // 德语维基导游中的文章 wtf.fetch('Toronto', { lang: 'de', wiki: 'wikivoyage' }).then((doc) => { console.log(doc.sentences()[0].text()) // 'Toronto是安大略省的首府' })
你也可以使用维基百科页面ID作为参数,而不是页面标题:
let doc = await wtf.fetch(64646, 'de')
fetch方法会跟随重定向。
wtf.getCategoryPages(title, [options])
获取属于给定分类的所有页面和子分类:
wtf.extend(require('wtf-plugin-api')) let result = await wtf.getCategoryPages('Category:Politicians_from_Paris') /* { [ {"pageid":52502362,"ns":0,"title":"William Abitbol"}, {"pageid":50101413,"ns":0,"title":"Marie-Joseph Charles des Acres de L'Aigle"} ... {"pageid":62721979,"ns":14,"title":"Category:Councillors of Paris"}, {"pageid":856891,"ns":14,"title":"Category:Mayors of Paris"} ] } */
wtf.random([options])
从给定语言或域名获取随机的维基百科文章
wtf.extend(require('wtf-plugin-api')) wtf.random().then((doc) => { console.log(doc.title(), doc.categories()) //'Whistling' ['口头交流', '声音技巧'] })
这些插件添加了各种新功能:
wtf.extend(require('wtf-plugin-classify')) await wtf.fetch('Toronto Raptors').classify() // 'Organization/SportsTeam' wtf.extend(require('wtf-plugin-summary')) await wtf.fetch('Pulp Fiction').summary() // '一部1994年美国犯罪片' wtf.extend(require('wtf-plugin-person')) await wtf.fetch('David Bowie').birthDate() // {year:1947, date:8, month:1} wtf.extend(require('wtf-plugin-i18n')) await wtf.fetch('Ziggy Stardust', 'fr').infobox().json() // {nom:{text:"Ziggy Stardust"}, oeuvre:{text:"The Rise and Fall of Ziggy Stardust"}}
插件 | |
---|---|
classify | 人/地点/事物 |
summary | 简短描述文本 |
person | 出生/死亡信息 |
api | 从API获取更多数据 |
i18n | 改进多语言模板覆盖 |
wtf-mlb | 获取棒球数据 |
wtf-nhl | 获取冰球数据 |
nsfw | 标记色情/图形/成人文章 |
image | .images() 的附加方法 |
html | 输出html |
wikitext | 输出wikitext |
markdown | 输出markdown |
latex | 输出latex |
维基百科API相当欢迎使用,但如果你要大量使用,建议遵循以下三点 -
Api-User-Agent
作为某种标识,以便他们可以轻松限制不良脚本<!-- 分隔符 --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/>wtf .fetch(['Royal Cinema', 'Aldous Huxley'], { lang: 'en', 'Api-User-Agent': 'spencermountain@gmail.com', }) .then((docList) => { let links = docList.map((doc) => doc.links()) console.log(links) })
size
参数可自定义大小)jpg
)你可以使用wtf.extend()
向库中的任何类添加新方法
wtf.extend((models) => { // 将此方法添加进去... models.Doc.prototype.isPerson = function () { return this.categories().find((cat) => cat.match(/people/)) } }) await wtf.fetch('Stephen Harper').isPerson()
你的维基使用{{foo}}
模板吗?为它添加一个自定义解析器:
wtf.extend((models, templates) => { // 创建一个自定义解析函数 templates.foo = (tmpl, list, parse) => { let obj = parse(tmpl) //或者使用自定义正则表达式 list.push(obj) return 'new-text' } // 数组语法允许轻松标记参数 templates.foo = ['a', 'b', 'c'] // 数字语法用于按参数编号返回 '{{name|zero|one|two}}' templates.baz = 0 // 用字符串替换模板 '{{asterisk}}' -> '*' templates.asterisk = '*' })
默认情况下,如果没有模板的解析器,它将被忽略并生成一个空字符串。 但是,可以配置一个后备解析函数来处理这些模板:
wtf('some {{weird_template}} here', { templateFallbackFn: (tmpl, list, parse) => { let obj = parse(tmpl) //或者使用自定义正则表达式 list.push(obj) return '[unsupported template]' // 或返回null以忽略此模板 }, })
你可以使用第三个参数确定哪些模板被理解为"信息框":
<div align="right"> <a href="https://observablehq.com/@spencermountain/wtf-wikipedia-plugins">插件文档</a> </div> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/a6dfb3a3-c366-4aca-91a9-fbd09df15d04.png"/> </div>wtf.extend((models, templates, infoboxes) => { Object.assign(infoboxes, { person: true, place: true, thing: true }) })
默认情况下,已安装的MediaWiki应用程序提供公共API。 这意味着大多数维基都有一个开放的API,即使他们没有意识到这一点。一些维基可能会关闭这个功能。
通常可以通过访问http://mywiki.com/api.php
找到它
要从第三方维基获取页面:
wtf.fetch('Kermit', { domain: 'muppet.fandom.com' }).then((doc) => { console.log(doc.text()) })
一些维基会将其API的路径从./api.php
更改为其他位置。如果你的API有不同的路径,你可以这样设置:
wtf.fetch('2016-06-04_-_J.Fernandes_@_FIL,_Lisbon', { domain: 'www.mixesdb.com', path: 'db/api.php' }).then((doc) => { console.log(doc.template('player').json()) })
为了使图像URL正常工作,维基还应启用Special:Redirect
。
一些维基(如Wikia)有意禁用了这个功能。
wikitext(令人惊讶地)在所有语言、维基,甚至在从右到左的语言中都被使用。 这个解析器在处理这方面也做得相当不错。
库中包含了Wikipedia I18n语言信息,涵盖_重定向、信息框、分类和图像_,覆盖范围相当广泛。
要改善I18n模板的覆盖范围,请使用wtf-plugin-i18n
如果你发现你的语言缺少某些内容,请提交PR。
<!-- 间隔 --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/>该库提供独立的客户端和服务器端构建,以保持文件大小。
./wtf_wikipedia-client.mjs - 作为ES模块(或Deno)
./wtf_wikipedia-client.min.js - 用于生产环境
./wtf_wikipedia.cjs - Node CommonJS构建
./wtf_wikipedia.mjs - Node/Deno/TypeScript ESM构建
浏览器版本使用fetch()
,而服务器版本使用require('https')
。
它不是最快的解析器,也不太可能在速度上超过C或Java中的单程解析器。
使用dumpster-dive,这个库可以在MacBook上用约4小时解析完整的英文Wikipedia。
这大约是每线程每秒100页。
<!-- 间隔 --> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/e9dc6a28-ae69-4a01-85fb-7c672da52879.png"/> <div align="center"> <img height="50px" src="https://yellow-cdn.veclightyear.com/835a84d5/a6dfb3a3-c366-4aca-91a9-fbd09df15d04.png"/> </div>其他替代JavaScript解析器:
以及更多!
MIT
AI小说写作助手,一站式润色、改写、扩写
蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号