![Citirea cu propriile mâini (node.js) Lizibilitate mâinile proprii](https://images-on-off.com/images/159/readabilitysvoimirukami-611fb909.jpg)
Despre ce este vorba?
Lipsă lirică despre parseri
Caracteristica principală a unui analizor de situri sau a altor formate slab structurate este cantitatea de cunoștințe despre cazuri particulare de utilizare a formatului în sălbăticie.
Un caz degenerat de a avea toate cunoștințele este un parser al unui singur site. Ie dacă vrem să fure articole Habrahabr, de exemplu, pentru a le imprima pe timp de noapte pe o imprimantă cu jet de cerneală și un sacrificiu pentru Satana - ne putem uita la aspectul existent și este ușor să se determine că titlul post este h1.title.
Un program scris în acest fel aproape că nu va fi greșit; pentru fiecare site diferit de Habrahabra este necesar să se scrie un nou program.
Un caz ideal degenerat: parserul nu știe în ce format a primit datele. Un exemplu de astfel de program este șirul de caractere (există în majoritatea sistemelor de operare care nu sunt folosite în joc).
Dacă aplicați șiruri într-un fișier care nu poate fi citit, puteți obține o listă cu tot ceea ce arată ca textul din interiorul acestui fișier. De exemplu, comanda va imprima o gramada de linii pentru formatare în ls binar. și ajutor.
Cu cât cunoașterea este mai mică, cu atât este mai generală parserul.
Ce este deja acolo
Versiunea actuală de citire este închisă și atârnată cu chifle de diferite cereri. Există un API.
Există o furcă a primei versiuni a Readability by Apple (funcția Reader în browser-ul Safari). Codul sursă nu este foarte deschis, dar uita-te la ea cât posibil, există chiar mai multe expresii regulate și cazuri speciale (de exemplu, există o variabilă - isWordPressSite).
Probleme ale scriptului original - complexitatea modificării, heuristica arcadei. Practic funcționează, dar necesită o reglare finală a dosarului. Versiunea Apple este licențiată, de asemenea, incomprehensibil.
Ce trebuie să scrii
Un parser de site-uri cu cunoștințe minime de marcare. Date de intrare - o pagină a site-ului sau un fragment al paginii. Rezultatul este o reprezentare de text a datelor de intrare.
Un criteriu important este universalitatea: programul va funcționa atât pe client, cât și pe server. Deci, noi nu devin atașate la implementari existente ale DOM, și de a construi structura de date (de asemenea, funcționează mai rapid decât DOM completă, deoarece datele trebuie să gulkin, de exemplu, nas).
Din același motiv, programul nu va putea să descarce în mod independent pagini de pe Internet, să stocheze rezultatele pe un disc, să aibă o interfață cu utilizatorul, să împletească o cruce.
Algoritmul vieții și aventurii
Motorul de căutare a găsit mai multe articole despre algoritmizarea procesului de mai sus. Cel mai mult mi-a plăcut aceste PDF-uri chinezești.
Formulele la mine s-au dovedit și altele, așadar voi vorbi despre varianta algoritmului chinezesc.
Extinderea pentru exploatarea muncii
Doar în cazul în care eu încă mai verifica că după îndepărtarea resturilor evaluarea părintelui a crescut, în cazul în care nu (sau a crescut nesemnificativ) - Nu șterge dacă nu este suficient.
HTML. Algoritmul nu utilizează cunoștințe despre structura documentului, poate fi acum adăugat pentru a îmbunătăți (sau accelera) activitatea programului. Ie spuneți, anticipați în avans
Semnale de text. Dacă textul conține virgule, puncte și alte semne de punctuație, acesta este probabil un text coerent (spre deosebire de navigație, spre exemplu). Acest euristic era în Readability.
Aici trebuie să fim atenți la faptul că semnele de punctuație în diferite limbi sunt încă diferite, iar virgulele din chineză ("# 65292;" Unicode U + FF0C) diferă de simbolul "," (ASCII 44).
Ce sa întâmplat, cum să folosiți
Rezultatul pe care l-am numit lizibilitatea nepretențioasă2, stabilit în npm.
Pe scurt despre teste
Pentru a testa un astfel de lucru este necesar pentru a evita regresii (și, în general, pentru a testa automat programele - este cool).
Surse fără teste: GitHib
Exemplu de utilizare
Pentru scopuri ilustrative, am scris o pagină demo.html. în care două linii de text sunt printre toate navigația.
Textul se numește "Nume". Conținutul:
Întregul cartier a urmărit liniștit miracolul lui Dumnezeu:
Pop Ignatius tilibonkal rațiunea lui biserică.
Acest lucru ar trebui să fie rezultatul executării programului. Dacă rezultatul nu este așa, atunci totul sa descompus.
Documentație, este API
Designer:
El nu acceptă nimic.
Interfața SAX:
Aici toate argumentele sunt șiruri de caractere.
Pentru a obține rezultatul:
La ieșire: res.heading - titlul articolului și textul - textul principal fără formatare.
În loc de reader.clean puteți scrie un alt formatator, atunci nu veți primi text, ci doar un markup simplu, de exemplu.
![Citibilitatea cu propriile mâini (algoritm) Lizibilitate mâinile proprii](https://images-on-off.com/images/159/readabilitysvoimirukami-54f49be6.jpg)
Notă importantă: imaginea din stânga nu are nimic de-a face cu postul. Prin urmare, dacă nu pornește, și nu vedeți nici o imagine în stânga - nu vă descurajați.