StyloBot-julkaisusarja: Paikallinen merkintäjärjestelmä (Suomi (Finnish))

StyloBot-julkaisusarja: Paikallinen merkintäjärjestelmä

Wednesday, 24 June 2026

//

17 minute read

Cloudflare's M SK1Markdown-modus" antaa AI- crawlereille puhtaan tekstin renderoidun HTML:n sijasta . StyloBotin operaattorit saavat samaa mahdollisuutta StyloExtractin välitykselläMSC4 toiminnassa paikallisesti Stylobotin verkon kauttaMST5 riittävän nopeasti, että ne voivat istua kuumalla tielläMSR6 ilman muutoksia etenevälle alueelleMSL7 Tämä on se, mitä StyloEXtract tekee MSR8 miten se liitetään Stylo BotiinM SR9 mitä lucidVIEWin kautta syötävä koiranliha on pyytänytMR10 ja mikäMTR11 on vielä murskautunutMRT12


Halusin kopioida

Cloudflare lähettää featuren, jossa, jos tunnustettu AI-lyöntilähettiläs pyytää sivua , reuna palvelee komission Markdownin mukaista versiota täydestä HTML:sta instead of the full HTMLM SK2 Lyöntilöytäjä saa todellisen sisällön ilman minkäänlaista kromiaa, minkäänlaisia JavaScriptin välisiä välityksiäMSC4 minkinlaisia cookie-bannereitaMST5 käyttäjäMSV6 sivusto pysyy samanlaisenaMSV7 Lyyntilähelähettilään elämä helpottuu. Cloudflaare joutuu maksamaan siitäMsv10 Jokainen voittaaM Sv11

Rakenne on ilmeinen ulkopuolelta: luokittelee pyynnön crawleriksi |(Cloudflare tekee jo tämän | ), vetää sivun läpi jonkinlaisen sisällön |

Samoin on StyloBot-operaatorin kohdalla kolmea estettä Cloudflare ei'tM SK1

  1. Site on StyloBot-portaalin yläpuolella. Cloudflare voi palvella merkitsemistä, koska ne ovat reunaa. StyloBotin porttipaikka on etupäässä sen alkuperäisistä lähtökohdista eikä sitä valvotaM SK1, YARP:n lähentämisessä . sisältöä on otettava pois porttihuoppauksestaMSC4 ei alkuperällä eikä tietyllä SaaS-rajallaMST5tripMSP6 Etupääsypaikka säilyy koskemattomana MST7
  2. Paikallinen. Ei Pythonia Portaali on yksinkertainen AOT-julkaissut kaksoiskirjat.Python sivuauton lisääminen HTML:iin merkitsemiseen voittaa käyttöönottomuodonM SK2
  3. Nopeudella, joka riittää isttumaan kuumalla tiellä. Jos "serve Markdown AI- crawlereihin" lisää 200ms pyynnöstä kohtiM SK3 operaattori sulkee sen poisMSC4 Talousarvio on alempi kuin SSK5ms pMST6 Cache-hyökkäyksen yhteydessäMRK7 mikä on se, mitä nykyinen havainnollinen keskinäinen ohjelmisto elää sisällään

StyloBot-puolessa tämä on jo tehty: havaintolinjoilla luokitellaan AI crawlerit (BotType.AiBot) samassa nopeudessa -path latency kuin kaikki muut päätökset DetectionPolicyMiddleware 7.x lähettää tuomion mukaan nimettyjä toimintapolitiikkoja, joten extract-markdown politiikasta "AiBot-osoitteessa /docs/*" on config-liini. puuttuva osa oli itse ekstraktori

That's StyloExtract : HTML-toM SK3Markdown-laaja, joka on parissa StyloBotin kanssaMostlylucid.BotDetection.StyloExtract) ja se sääntö, joka aktivoi sen on kuusi JSON:n riviä . operaattori laskee paketin mukaanM SK2 lisää sääntöä, ja AI-lyöntilaatijat alkavat saada Markdownia samoista URL:istä, jotka edelleen palvelevat HTML:tä ihmisille

Mitä " merkitsee käytännössä

Jos lukee täsmennyksen face-arvolla, on ratkaistu ongelma.

Todelliset -maailman verkkosivut ovat 80-95% kattoplate. Artikla, jonka haluatte todella elää kahden tai kolmen pakkauksen sisällä <div>s kaksi tai kolmesta sadasta. Naiivi HTML-M SK2Markdown-kirjasto muuntaa kaiken : jokainen navlinkin linkki, , jokainen cookiebanner-fraasi,, kaikki footerit, MSC6 kaikki lähimmäisosat, M SK7 sivuskennät, , kaikki jakelupuitteet, MRK9 kaikki CSS:n salaamat, mutta DOM:ssä esitetyt muodot, MST10 crawler pyysi artiklaa, MSV12 te luovutitte sen kokonaisuudessaan, MST13KB Markdown-tietokanta, jossa artikla on haudattu jonnekin verkossa.

Eli tuottajien on tehtävä kaksi työtä:

  1. Identifioida elintä. Mitkä parsoidun DOM:n alametsät sisältävät todellisen sisällön, ja mitkä alametät ovat kromia?
  2. Renderaa elimen. Kun olette isolaoineet sen, olette ottaneet käyttöön ”,” -hankkeen, joka merkitsee alapuua, jolla säilytetään rakenteellinen rakenne ja jossa sivusijoittavat ”(” -kirjan käyttäjät tai LLM-kirjailijat.

Tunnustaminen on vaikeampaa. verkkosisältöjen extrakointi ja vakiintunut vertailukohta on WCXB. Kun aloitin lukeman, tekninen tilanne oli python väline, joka kutsuttiin Trafilatura. Siirsin laadunM SK2 ideas bearing to .NET ja lisäsin kerroksen. mallin oppiminen rakenteellisen sormenjälkien avulla.

Kuva on:

parse HTML → clean → fingerprint the structure → does this fingerprint
  match a template I've seen on this host before?
    yes → apply the cached extractor → render
    no  → run the heuristic classifier → induce a fresh extractor →
          cache it under this host's fingerprint → render

Ensimmäistä kertaa, kun verkonhaltija katsoo sivun, se maksaa täydellisen heuristismin.1(~200μs keskimääräisestä sivusta.3,μs jokaista seuraavaa sivua, jonka rakenteelliset sormenjäljet vastaavat toisiaan, saa sen sijaan cached-extractorin.

sormenjälki on MinHash-esitys normalisoituun DOM:iin verrattuna.

Matkailija

Render-puoli on se, missä dogfooding loop sai minut saamaan sen.

StyloExtractin ensimmäisessä versiossa otettiin käyttöön merkintäpiste, joka koski luokiteltujen lohkojen kulkua ja esittämistä. element.TextContent.Trim() outputiin. Jokainen lohko muuttui kappaleeksi . Jokainen otsikko muuttui # text riippumatta siitä, oliko kyse H1 tai H 4. Ankkurit romahtivat tyhjäksi tekstiksi. Luettelot menettivät pistonsaM SK3 Kodiblokit menettivät savunsaMSC4 Tabelkat flattened to comma

Tämä on teknisesti "Markdown." SeM SK2se on myös hyödytöntä . AI- crawler pyytää Markdownia välttää kromin parsointia, ja annamme sille kappaleiden muurin, jossa ainoa signaali on toisinaan yksinkertainen -tekstinimityslausekkeet M SK2 Markdown-palvelun koko tarkoitus on se, että rakenne sisältää tietoa . Poistakaa rakennetta ja te MSC4 olette juuri antaneet crawlerille hieman pienempiä stringien taskuja

Näin ollen StyloExtractin seuraavassa versiossa kulkee kunkin luokiteltuun sisältöön kuuluvan lohkon DOM-aluetta ja lähetetään todellinen GFM:

  • <h1> läpi <h6> muuttuvat 1 6 kautta # Luettelo henkilöistä
  • <a href> muuttuu [text](href)
  • <em> ja <strong> pitämään painopisteensä
  • <code> stays backticked, <pre> tulee suojattuun lohkoon, jossa language-x siirretään
  • <ul> ja <ol> välittämään todelliset kulkat ja numeroitetut luettelot
  • <blockquote> edellytetään jokaista riviä > ( ja monenmukainen -kohdan lainaus saa > body\n>\n> body yleissopimus)
  • <table> on reconstructed via WHATWG slot-grid algorithm with proper colspan / rowspan ♫ / caption ♫/ alignment handling ♫ МSK4 ♫ falling back to raw HTML when the source is too complex for GFM to express ♫
  • Kuvat esitetään ![alt](src) riippumatta siitä, ovatko ne ns. ' -linjoissa tai itsenäisinä <figure>

Kävijä on yksi StringBuilder kutakin lohkoa kohden, sisäinen räjähdyspufferi, jota käytetään uudelleen eri solujen välillä / lista-asiatM SK2 ja yksi siirtymä DOM:stäMSC3 mukauttamisen jälkeen ( ensimmäinen katkaisu oli ♫304μs ♫ / ♫

Joki on myös se osa, joka murtui ensimmäisenä.

Eläintarvikeketju

lucidVIEW on Markdown-lähestys, jonka olen rakentanut StyloExtract:n rinnalla. Tuotanto on sivustakatsoja- sivukirjaaja, joka ottaa URL:nMSC2 vie sen poisM SK3 hallinnoi StyloEXTRACT:tä vastauksena, ja kuvailee tuloksena syntyvän Markdownin\ . Käytännön tapaus on |" Haluan lukea tämän blogin artikkelin hitaasta yhteydestä ilman JavaScriptiaMST7 tai puhelimessa ilman mainontavarastoja\MST8 tai vain siksi, että alkuperäiselle sivulle on silmää\MstK9valaistettu CSS\ MSTK10 täytäntöönpano on Stylo Extract serverissä\ MstK11 pieni Markdown -lähetyslähettiläs браузерissa\ MTSK12 eikä mitään muutaMTSK13

What lucidVIEW gave me was a dogfooding loop with teeth. The other StyloBot release-series articles talk about the dashboard as the dog fooding surfaceM SK2 thatMSC3s true at the protocol layerMNK4 But the dashboard is reading data the detection engine produces and rendering it to minä. IM SK1m ketjussa . I'll forgive a lot of weird\ -\looking output as long as the underlying counters are right\ .\

lucidVIEW -lähetyslähettäjälle merkitsee merkintälaskua (me, mutta lukee sisältöäMSC2 SeM SK3 on samanlainen muoto kuin AI- crawlerin käyttötarkoitus : joku kuluttaa tulostani kuin aine, ei välineenäM SK1 Jos output on vääränlainen , huomaatte sen välittömästi. On olemassaMSC4joka ei ole abstraktointilaajaa X:tä tuottanut ekstraktori " ja "Luen X:ta

Näin ollen aion avata lucidVIEWin kiinnittämällä huomiota omaan blogini indeksiin. [Post title](/blog/post) - kirjallinen lipputeksti - styled clickable linkin sijasta

Yhdyskunta-test suite on vihreä. asentaminen IM SK2d kirjoitettu MSC3ankkuri sisällytettyyn HTML:iinMST4 välityksellä . Tulos sisältää stringin [Post title](/blog/post). Markdown on joka tapauksessa väärä

Bug-luokka ei olisi saanut minkäänlaisia kokeita

blogiindeksi on rakennettu Tailwindin avulla. TailWindin output on luettavuuden vuoksi luettavissa: kukin wrapper div sijoittaa kaksi tilaa pidemmälle kuin sen vanhemmanM SK2 kun saavutatte blogin varsinaisen ankkurin,

<section class="...">
    <div class="container...">
        <div class="grid...">
            <div class="card...">
                <a href="/blog/post-a">Post title</a>
                ...

Lähtökäteilijä'tekstiM SK1käsittelyapuväline, AppendEscapedInline, romahtaa runsit valkoisesta tilasta yksiin tilanteeseen . Yhdessä puheenvuorossa se tekee tämän oikein: toiminnalla säilytetään prevWs lippu, joka supistaa peräkkäiset valkoiset kentät, säteilytyy. soittojen välillä, lippu resetoidaan . joten kun kävelylähettiläs vierailee peräkkäistä tekstiäMSC3nodeM SK4-whitespace siblings |- mikä on juuri se, mitä lueteltu HTML tuottaa tyhjän verkon elementtien välille | - kukin puheenvuoro säteilyttää yhden romahtaneen johtavan kentän rivissä |

Neljä luetelmahelinää, neljä tekstiä -nodeM SK2valkoalueet siblings, neljä romahtunutta paikkaaMSC4 CommonMarkMST5s lueteltunaMSR6koodiMSL7bloktisääntö palaa neljään paikkaanMSV8 kävely [Post title](/blog/post) lands on line that starts with four spaces. Markdig parses the entire line as a code block

Yksikön testi menee läpi, koska testi vahvistaa stringin [Post title](/blog/post) appears somewhere in the output. It does. ItM SK2s just inside a code block now

Päätöslauselma on kaksi riviä: prevWs = true Näin ollen ensiksi kussakin tekstissä olevaa valkoista tilaa siirretään pois sen sijaan, että se lähetettäisiin. Vedävä valkoinen tilaa sisällytettyjen HTML:ien sisäpuolella ei koskaan saavuteta tulosta

On mielenkiintoista, mitä testi olisi ovat todenneet.PohjoinenM SK1teksti .Contains() tarkastaa Luettelo henkilöistä Ne olivat vain väärässä CommonMark-bloktimuodossa. rakenteellinen assertion: parsi walkerin output:n todellisen CommonMark-parserin avulla ja vahvistaa, että kappaleet ovat kappaleita , linkit ovat yhteyksiä M SK3 ei virheellisiä koodibloktejaM SK4 Markdig' AST antaa teille sen ilmaiseksi–. Näin ollen bug fix hylättiin regressitestilläMSC7 ja regressiotesti hylätettiin lint harnessillaMST8 pieni auktori, joka ottaa minkä tahansa walker-outputun

  • Nollaotsaiset koodiblokit, ellei suojattu bloki ole alkuperää
  • Jokainen lähdeHTML:n linkki säilyy todellisena LinkInline AST-maissa
  • Suljettu-bloktilaskelma vastaa ilmoitettua odotusta

Todistaakseni, että lintilla oli hampaita, palautin alkuperäisen korjauksen ja käynnistin lintin yhdistelmän. Yhtä tarkasti yhtä testiä ei onnistuttu M SK2 se, jossa käytetään neljää - pyydettyä

Tämä yksikertainen tarkistus suoritetaan nyt suiten jokaisessa jalankulkijoiden testauksessa.. Saman luokan tulevia regressiivejä havaitaan rakenteellisella tavalla.

mostlylucid.net rendered in lucidVIEW after the v 1.7.1 walker fix: every blogM SK3post card resolves as a real clickable link with its summary as a proper paragraph

Se, mitä dogfooding todella vaatii

Kaikissa tuotteissa on vaihe, jossa yksikön testit ovat vihreitä ja demo toimii, ja operaattori on asettanut oikean konfigurointipatentin ja saatte julkaisun, ja päivä myöhemmin käyttäjä avaa kysymyksen sanomalla: " – tämä ei toimi, '” – ei toimi reaalisisältöä varten.

Hunderuokintaketju on halvin keino päästä ulos tästä ansasta. Sanontaa "dogfoodingM SK2 käytetään vapaasti ; tässä tapauksessa se tarkoittaa jotakin erityistäMSC4 lucidVIEW on erillinen tuote, erillisten käyttäjien kanssa kulutetaan StyloExtract' outputia tuotteen pintana. Jos lucidVIEW osoittaa hajanaisen Markdown-merkinnän, , lucidVIEW' käyttäjät valittavat lucidVIEWstaM SK3 valitus on erillinen ongelmaseuraajaMSC4 erillinen triage queueMST5 erillistä versiota vastaanMSSK6 StyloExtractin näkökulmasta tämä on ulkoinen käyttäjä, joka toimittaa bugin

Se erottaminen on tärkeää. Jos lucidVIEW olisi StyloExtract-test-laittee, olen kirjoittanut sen sterilisella sisällöllä, koska tiedän, mitä ekstraktorilla on mieltymyksiään. Sillä lucidVIEW on omassa maailmassaan , se viittaa varsinaiseen blogiiniM SK5 jossa käytetään TailwindiaMSC6 jossa tuotetaan silmälläpitäytynyt HTML-muodon, joka käynnistää bug-luokanMST7 Bug nousi esiin viiden minuutin kuluessa siitä, kun tuotetta käytettiin käyttäjänä.

Suuri osa v1.7.x-ohjelmista palaa tähän kierteeseen.

Muodot' eivät ole uusiaM SK1 Tässä artiklassa nimitetään niitä: rakentamaan kulutustuotteet rinnakkain teidän infrastruktuurituote, ja kuluta omaa infrastruktuurianne kuluttajien välityksellä luokka infrastruktuurin kattavuus laajenee kaikilta osin, kun kuluttaja huomauttaa, että ette ole suunnitellut kirjoittavansa testiä.

Suljetut loopit eri puolilla palausta

StyloExtract / lucidVIEW on yksi tapaus mallista, jota käyn läpi kaikissa hankkeissa.

flowchart LR
    PB[visible product<br/>behaviour] --> TR[test/review<br/>loop]
    TR --> AP[architectural<br/>primitive]
    AP --> RL[reusable<br/>library]
    RL --> WE[written<br/>explanation]
    WE --> LG[LLM-readable<br/>grammar]
    LG --> NP[next<br/>product]
    NP --> PB

Ongelma on otettu esiin tuotteessa. korjauksesta tulee rakenteellinen väite |(testi | / | tarkistusloopi ). | väite muuttuu primitiviksi, jota muut asiat voivat käyttää |. | primitivista tulee kirjasto | . | kirjastosta kirjoitetaan |

Riippuvuusgrafiikka, jonka tämä tuottaa – , – kaikissa hankkeissa, joita käyn –, – näyttää olevan

flowchart TB
    LV[lucidVIEW<br/>Avalonia markdown reader]
    SB[StyloBot<br/>detection gateway]
    SF[StyloFlow<br/>policy + flow runtime]
    SE[StyloExtract<br/>HTML → Markdown]
    NA[mostlylucid.Naiad<br/>Mermaid renderer fork]
    DA[mostlylucid.dagre<br/>graph layout]
    EP[mostlylucid.ephemeral<br/>signal + sketch primitives]
    UT[Mostlylucid.Avalonia.UITesting<br/>Avalonia UI test framework]

    SB --> SF
    SB --> SE
    LV --> SE
    LV --> NA
    NA --> DA
    SE --> EP
    SF --> EP
    LV -.tests via.-> UT

Mostlylucid.Avalonia.UITesting lopettaa samankaltaisen ketjun pöydällä. StyloExtract .Playwright sulkee sen päättömättömillä puolillaM SK2 verkkopuolella. Sama malliMSC4 erilainen pinta-alaMST5 testausMSV6 automaattisen yhteyden avulla agentinen ketju todellisuudessa tarkistaa tuotteen käyttäytymisen, jonka se oli tarkoitus korjata

Kauppa on todellista. Grafi on kiistatonM SK1 On virhe mostlylucid.ephemeral ripples up through StyloExtract and StyloFlow into StyloBot and lucidVIEW. lievennys on aika -boxed releases (no feature creepMSC3 version ships when the scope it claims shipsM SK4 ja että jokaisella kerroksella on oma test suitensaMST5 etuna on se, että voin työskennellä kaikissa niissä viikon kuluessa ja että niiden välinen kumoaminen pysyy alhaisena.

Se merkitsee myös sitä, että tämän artikkelin kirjoittaminen ei ole'ei sivuaM SK1laivauksen vaikutus StyloExtract. Kirjous on yksi vaiheista .muodon ulkoistaminen prosoiksi sulkee ketjun, joka alkoi MSC4blog-kortit renderoidaan vääriä lucidVIEWin kanssaMST5 ja päättyy "StyloExtractin seuraavalla kuluttajalla on rakenteellinen lint helper ja asiakirjallinen kävelysopimusMSL7

Tämä toimii minulle, koska suljettavat loopit ovat mielestäni sellainen tapa.

Miten lucidVIEW kytkey sen

flowchart LR
    URL[URL bar] --> Fetch[HttpClient GET<br/>Accept: text/markdown, text/html]
    Fetch --> Sniff{Content-Type}
    Sniff -->|text/markdown| Render[LiveMarkdown.Avalonia]
    Sniff -->|text/html| Convert[HtmlToMarkdownService]
    Convert --> Sparse{< 200 chars +<br/>SPA markers?}
    Sparse -->|yes| Stub[Stub: needs JS,<br/>open in browser?]
    Sparse -->|no| Render
    Stub --> Render

Neljä pakettiohjetta ja yksi palvelu:

public sealed class HtmlToMarkdownService
{
    private readonly IHtmlDomParser _parser = new AngleSharpHtmlDomParser();
    private readonly IDomCleaner _cleaner = new DomCleaner();
    private readonly IBlockSegmenter _segmenter = new BlockSegmenter();
    private readonly IBlockClassifier _classifier =
        HeuristicBlockClassifier.LoadFromEmbeddedResources();
    private readonly IMarkdownRenderer _renderer = new TypedMarkdownRenderer();

    public string Convert(string html, Uri? sourceUri = null)
    {
        var doc = _parser.Parse(html, sourceUri);
        _cleaner.Clean(doc);
        var blocks = _classifier.Classify(_segmenter.Segment(doc));
        return _renderer.Render(blocks, ExtractionProfile.RagFull);
    }
}

Se's itM SK1 Tilanne-bar-Symboli osoittaa, mikä tie kulkee MSC3suora MD / muunnettu / SPA-stubMST6 niin että kun jokin vaikuttaa väärältä käyttäjä voi osoittaa oikean kerroksen \ .

Wikipedia's Markdown artikla rendered inside lucidVIEW via StyloExtract

Kaasuputki*,* vaiheittain

flowchart LR
    HTML[HTML] --> P[AngleSharpHtmlDomParser]
    P --> C[DomCleaner<br/>strip script/style]
    C --> S[BlockSegmenter<br/>candidate subtrees]
    S --> K[HeuristicBlockClassifier<br/>role + score]
    K --> W[DomMarkdownWalker<br/>GFM per block]
    W --> R[TypedMarkdownRenderer<br/>profile gate]
    R --> MD[Markdown]

Parsaattori + puhdistaja on AngleSharp wrappersM SK1 mielenkiintoinen koodi alkaa segmentaatiosta .

Segregaattori. Lähkäisy ruumiilla, sink any semantic tag M SK1main/article/section/h1-h6/ul/pre/...) plus mikä tahansa <div>/<section> , että'teksti-painokas tai jolla on paljon lapsia .Kaikki muu on liian pieni ollakseen tyytyväinen

public IReadOnlyList<IElement> Segment(IDocument document)
{
    if (document.Body is null) return Array.Empty<IElement>();
    var result = new List<IElement>();
    Walk(document.Body, result);
    return result;
}

private static void Walk(IElement element, List<IElement> sink)
{
    if (SemanticTags.Contains(element.TagName))   sink.Add(element);
    else if (IsBlockyDiv(element))                sink.Add(element);
    foreach (var child in element.Children) Walk(child, sink);
}

Luokittelujärjestelmä. Tuki jokaiselle ehdokkaalle, valita ei-toisetM SK1 päällekkäisyyt voittajat , merkitsemällä BlockRole (Keskeinen sisältö ,Lisäkohta,NavigointiM SK3Kaikki valitut lohkot saavat DOM:n, joka kulkee rakenteellisessa merkinnässä.

foreach (var element in selected)
{
    var role = ClassifyRole(element);
    yield return new ExtractedBlock
    {
        Role     = role,
        Text     = element.TextContent.Trim(),
        Markdown = ShouldRenderMarkdown(role) ? DomMarkdownWalker.Render(element) : "",
        Links    = ExtractLinks(element),
        XPath    = XPathBuilder.For(element),
        // ...
    };
}

Walker. Yksi StringBuilder, yksi DOM-passi. <a> tapaus on, jossa v1.7.1 bug asui

case "a":
    var href = el.GetAttribute("href") ?? "";
    if (href.Length == 0) { WriteInlineChildren(dest, el); return; }
    dest.Append('[');
    WriteInlineChildren(dest, el);
    dest.Append("](").Append(href).Append(')');
    return;

(Pysymyksenä oli ', ei täällä, ., se oli AppendEscapedInline,, joka syötti johtavaa valkoista tilaa dest ennen kuin tämä tapaus koskaan käynnistettiin. Neljä kohtaa edellä [ tekee CommonMarkin parsoimaan riviä koodibloktina.)

Renderer. Puoli profiilien mukaan. RagFull säilyttää artiklan-lähetext M SK1Breadcrumb,Yhteiset yhteydetMSC3 ja pudottaa kromia (FooterMST5 HeaderMst6 CookieBannerM st7 NavMstr8 MainContentOnly pitää vain ruumiin AgentNavigation säilyttää vain nav:n ( crawlille-link discoveryM SK2

return p switch
{
    ExtractionProfile.RagFull => b.Role is not (BlockRole.Footer or BlockRole.Header
        or BlockRole.Advertisement or BlockRole.CookieBanner or BlockRole.Boilerplate
        or BlockRole.Unknown or BlockRole.PrimaryNavigation or BlockRole.SecondaryNavigation),
    ExtractionProfile.MainContentOnly => b.Role is BlockRole.MainContent or BlockRole.Article
        or BlockRole.Heading or BlockRole.Summary or BlockRole.Table or BlockRole.CodeBlock
        or BlockRole.RepeatedItem,
    ExtractionProfile.AgentNavigation => b.Role is BlockRole.PrimaryNavigation
        or BlockRole.SecondaryNavigation or BlockRole.Breadcrumb or BlockRole.Form,
    _ => true
};

JS-renderoitujen sivujen käännös

StyloExtract'heuristiikka toimii statisella HTML:llä, jonka serveri palautti. SeM SK2tuomitsee SSR-sivuille (WikipediaMST4 GitHubMSC5 suurin osa uutisartikkeleista URL-osoitteetMSSK6 Se katkeaa SPA-shelleissa, joissa näkyvä sisältö on hydratoitu klientiMSL7JSONin pyörremyrskyn rinnalla~: __NEXT_DATA__, __NUXT__, __APOLLO_STATE__. Statisessa HTML:ssä on meta-tageja, + skeletti, , ja luokitteluelimellä ei ole ruumiita löytää

Mostlylucid.StyloExtract.Playwright putken alkuvirtaan liittävät pistokset. Se toteuttaa IRenderedHtmlFetcher, ajaa päätön Chromiumin Playwrightin välityksellä , odottaa hydratointia M SK2 ja palauttaa postin-JS HTML:n muuhun ekstraktoriin

public async Task<RenderedHtmlResult> FetchAsync(
    Uri uri, RenderOptions? options = null, CancellationToken cancellationToken = default)
{
    var page = await _context.NewPageAsync();
    await page.GotoAsync(uri.ToString(), new PageGotoOptions
    {
        WaitUntil = WaitUntilState.NetworkIdle,
        Timeout = options?.NavigationTimeoutMs ?? 15000,
    });
    var html = await page.ContentAsync();
    await page.CloseAsync();
    return new RenderedHtmlResult { Html = html, FinalUrl = page.Url };
}

Sama parser, puhdistajaM SK1 segmentaattori, luokittelutekijäMSC3 kävelylähettiläs, , rendereri pohjavirtaan,. Ainoa ero on siinä, että input HTML sisältää nyt JS:n tuoman hydratoidun DOMin

flowchart LR
    URL[URL] --> Choice{Render mode}
    Choice -->|static| HTTP[HttpClient]
    Choice -->|js-required| PW[PlaywrightHtmlFetcher<br/>headless Chromium]
    HTTP --> Pipeline[parse → clean → segment<br/>→ classify → walk → render]
    PW --> Pipeline
    Pipeline --> MD[Markdown]

Tämä on oikea vastaus, kun operaattori käyttää StyloExtract-Serveriä- sivulla ja headless-lähetys on kohtuullinen riippuvuus stylo-extract (AOT,~12MB, statinen- vain) ja stylo-extract-playwright (~120MB kerran Playwright's browser pack landsM SK2 JS -capableMSC4

lucidVIEW ei käytä sitä. lucidVIEW on markerdown-lasaja; sen identiteetti on M SK1 ei Chromiumia , ei браузерin moottoria, ei 200 yksi piirre ei ole sidoksissa toisiinsaMSC5 Bundling Playwright sijoittaa päättötön browserin appiin, jonka pitch on yksin puute.

Muut asiat, joita dogfooding on tuonut esiin

Neljä muuta kuin lucidVIEW:n muodossa olevaa -:ta, ':ta ja -:tä aiheuttavaa virhettä sekä mode-käsittelyä että ::tä

  • Tarkistus, joka johti v1.7.0. Ensimmäisessä rakenteessa esitetyt kiinteät kappaleet (element.TextContent.Trim() kutakin ryhmää kohti). Wikipedia ei ollut luettavissa , blogikortit menettivät jokaista ankkuriaM SK2 Sen sijaan, että " tekisi sen paremman, kirjoitin docs/styloextract-markdown-spec.md luetellaan, mitä puuttui: otsikon tasot, inline-käynnitM SK2 luettelot , GFM-taulukotMSC4 lohkokuvat, neljää jäljentäjän URL:tä sisältävä luettelo

  • SPA-sivut. bbc.com/news on seuraava.js: staattinen HTML on meta-tageja + a __NEXT_DATA__ JS. StyloExtract palauttaa asianmukaisesti M SK1 charin, koska ei ole mitään ruumiita ' lucidVIEW nyt syyttää tunnettuja kehysmerkintöjä__NEXT_DATA__, __NUXT__, __APOLLO_STATE__, data-reactroot, ng-version=, __REMIX_DATA__) ja "This page uses ; lucidVIEW does not run JavaScriptM SK3 Open in browser BBC'artikkelin URL:t M SK1/news/articles/<id>) palvelee todellista <main> ja muuntaa puhtaasti. kotisivu M SK1 artiklan epäsymmetria, ei muuntajan epäonnistuminenMSC3

    lucidVIEW loading bbc.comM SK1news:detects NextSide rendering is not supported and offering an open-inM SK8browser handoff~.~ Status bar shows the warningMSC10triangle sourceMST11mode icon plus a MST12client MST13side renderedMTS14~ no conversion possibleMSS15 tag MTS16

  • Semantiikka-vapaat sivut. example.com ei ole <main>, ei <article>. Heuristiikka ei anna mitään oikeaa tulosta

  • Oikaisu- muttaM SK1käyttöönottoa päästöä . Luettelo blogini' kategoriasta on <select><option>. Matkailija ei löydä mitään <a href>, lähettää valinnaisen tekstin yhdeksi kohdaksi "Kaikki Oikeita (vaihtoehtoja ei ole 't linkit) mutta visuaalisesti kauhistuttavaaM SK3 Tulevainen jalankulkijoiden passi voisi havaita <select> ja antaa määritelmäluettelon tai [42 categories] yhteenveto.

Lisäksi yksi vartipiste, joka tuli esiin vastustamalla ilmeistä lyhyellä kädellä. Kun extraction on vähäinen houkutus on "palau Jina Readeriin / rMSC3jinaM SK4ai / TrafilaturaMST6 lucidVIEW ei'tMS. käyttäjien URL:ien siirtäminen kolmannen käyttäjän välityksellä- osapuolten lukeja tekee käyttäjästä yksityisyydenvuodatuksen; jokainen URL, jonka käyttäjä vierailee, kulkee jonkin muun operaattorin välille~ 's logsMST12 Fallback-ketju pysyy paikallisenaMSSK13 suora merkitseminenMSC14 sitten HTML StyloExtractin välitykselleMSL15 ja sen jälkeen metadatastubista <meta> / og: tagit, ja " avataan hakukoneessaM SK2 jokaista askelta ohjaa StyloExtract samasta alkuperästä peräisin oleva erillinen fetch, tai synteesi jo käytettävissämme olevista tiedoista. Vastaus M SK2joka ei muuttanut'muutottanut" ei koskaan "käytä erilaista muuntajaa

Riippumaton ”-”-site Coverage Gap

What the dogfood loop is good at finding is broken output on well

Minulla on nyt räjähdysmäinen runner, joka saa kymmeniä todellisia - World sitejä ja tuhoaa ekstraktorin ' output:n .:n rakenteellisesti yhteistyöhaluisen puolen -:n uutiset (:n BBC-lähettiläiden ထုတ်en ,:n Guardian-läheisten ထုတ်ten ),:n Wikipedian ထုတ်t ,:n GitHubin repo README-lähteiden ,:n Ghost-lähennyksen .:norg-lähteisen ':n muutoksen luettelon, ,:n Hacker News -läheiset uutiset -:n heuristisen luokitusjärjestelmän mukaan pääsisältöjä löydetään puhtaasti, ja kävely tuottaa sivulta 10–30 kilobajtia puhdasta proosaa.

Toisella puolella - Allbirds (Shopify), NotionM SK3s marketing pageMSC4 mitään, joka on rakennettu omien Tailwind-komponenttitietokantojen avulla. ei mitään. Nolla MainContent-blokit . Jokainen ehdokas heikennetään boilerplateyn, koska sivua ei käytetä <main> tai <article> ja luokkien nimet eivät vastaa mitään kehyksessä olevia malleja

Tämän JSON-tiedoston lisäys on itsestään selvä toimenpide. Se 's myös haukkuu-aMSC3moleM SK4 Jokainen teemakauppa lähettää uusia luokkien nimiäMST5 Jokainen Shopifyn julkaiseminen muuttaa niitäMSV6 Kaikista CMS-aiheista koostuvan luettelon Curating a list of every CMS theme~'s classMST8naming conventions is a full -time job and the list is stale the day you publish itMSV10~

Todellisena ratkaisuna on koulutettu malli. PerM SK1elementtimerkit (tag-identiteetinmuodonmuodonnähtämisoikeudellinen ,luokka, -nimihuutokerrat, ,teksti, MSC6pituus, M SK7liite, MST8densiteetti, MSV9silmämuodostus,,isovanhemmistön läsnäolo,MST11 pieneen vyöhykkeeseen,MSC12kuormitettu luokitusjärjestelmä,M SK13koulutettu WCXB:n merkintöjä sisältävällä komissiolla,, viedään ONNXiin,MSL15 kutsutaan .NETistä Microsoft.ML.OnnxRuntime. A 45-heuristinen vektori kutakin ehdokasta kohtiM SK2 ~10μs johtopäätökset kustakin osatekijästä kohti

Tämän suunnittelu on sitoutunut StyloExtract repo (docs/ml-classifier-v2-design.md). täytäntöönpanoa ei ole toteutettu,' ei ole tehty,. se, mitä ' on pysäytetty, ei ole ' ei teknisiä ponnisteluja, ;, se, mikä on ', on operaattoreiden kysymys siitä, että " siirtää 25MB ONNXin runtime native binary gatewayyn, MSC9:n käyttöönottoon, M SK10 tai pitää ML:n erillisenä vaihtoehtoisena pakettina, johon operaaattori valitsee ?":n. Vaihtoehtoinen -:n vastaus on oikea FOSS-paketti ekosysteemille, mutta se tarkoittaa sitä, että malli ei ole standardilla ':ssä vaan ,:ssä, mikä merkitsee, että useimmat operaattorit hyötyvät siitä.

Väliaikaisesti operaattorit saavat kirjallinen escape hatch, :, operaattori,-, arvostetut YAML-templatet, ,, yksi asiakirja kutakin vastaanottajaa varten, M SK3, parsoitu AOT, MSC4, puhdasta, MST5, kuumaa, MSR6, kyseisen vastaanottajan induktioputken ylittäminen, MSL7, operaaattori ilmoittaa weird-shopify-tenant.com tuottaa tyhjän Markdown-merkinnän, kirjoittaa viiden-line YAML-tietokannan, jossa sanotaan " tälle hostilleM SK3 MainContent on .product-description-body", laskee sen mukaan config/templates/, ja runtime ottaa sen pois FileSystemWatcherin kautta sekunnissa

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.