UNPKG

xscrape

Version:

A flexible and powerful library designed to extract and transform data from HTML documents using user-defined schemas

1 lines 1.13 kB
import{load as e}from"cheerio";function t(e){return async t=>{try{let a=n(t,e.extract),o=await r(e.schema,a);return o.ok?{data:await i(o.value,e.transform)}:{error:o.error}}catch(e){return{error:e}}}}function n(t,n){let r=e(t),i=a(r,n);return r.extract(i)}async function r(e,t){let n=await Promise.resolve(e[`~standard`].validate(t));return n.issues?{ok:!1,error:n.issues}:`value`in n?{ok:!0,value:n.value}:{ok:!1,error:Error(`xscrape: Validation succeeded but no data was returned`)}}function i(e,t){return Promise.resolve(t?t(e):e)}function a(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,o(e,n)]))}function o(e,t){if(Array.isArray(t)){let n=t[0];return[typeof n==`string`?n:s(e,n)]}return typeof t==`string`?t:s(e,t)}function s(e,t){let n=c(e,t.value);return n===void 0?{selector:t.selector}:{selector:t.selector,value:n}}function c(e,t){return t===void 0||typeof t==`string`?t:typeof t==`function`?(n,r,i)=>t(l(e,n),r,i):a(e,t)}function l(e,t){return{attr(e){return t.attribs[e]??void 0},text(){return e(t).text()},html(){return e(t).html()??void 0}}}function u(e){return t(e)}export{u as defineScraper};