Tarviis saada tuolta sivulta ensimmäiseltä riviltä missä tyyppinä esiintyy toto65, siltä riviltä olevasta linkistä 22 viimeistä merkkiä funktioon, jota voin käyttää osana konellee ladattavaa osoitette. Tarkoitus on saada käsiohjelmat lähdöistä automaattisesti taulukkolaskentaa. Tarkoitus on samalla metodilla saada myös toto76, tuo ensimmäinen rivi käy juurikin kun ajaa erikseen eli toto65 ti ja ke ja toto76 pe ja la.
Joskus olen jotain virittänyt mut nyt lyö totaalisen tyhjää.
Puuttuuko tästä nyt jotain olennaista tietoa, kuten esim
* mistä sivustolta tietoa pitäisi saada parsittua
* millä ohjelmointikielellä
* missä export formaatissa (CSV?)
* Onko jotain lähdekoodia siis jo olemassa, kun viittaat johonkin riviin joka käy jossakin
Okei. https://heppa.hippos.fi/heppa/racing/
Ok,
Mitä siis haluat tarkalleen ottaen. Onko käsiohjelma sama, kuin esimerkiksi tämän sivun sisältö: https://heppa.hippos.fi/heppa/app?page=racing/
https://heppa.hippos.fi/heppa/app?page=racing/
Siitä syystä siitä aluperäisestä pitäsi saada tuo numerosarja funktioon jonka sitten voi ympätä ladattaviin osoitteisiin.
Käviskö tuohon joku valmis palvelu?
Esim.
ParseHub
https://www.parsehub.com/
Vai onko tarkoitus nimenomaan harjoitella parsimista?
Tarkotus on saada vaan noi käsiohjelman tiedot koneelle automaattisena ei muuta. Mielestäni tuossa ei olisi ihmeemmin parsimista ainoastaan osoitin kohtaan Toto65 ja tietysti toissessa versiossa joka ajetaan eri päivänä Toto76. Seoraavaksi pitäsisi päästä siirtymään samalla rivillä olevaan linkkiin, josta talteen vaikkapa 22 viimeistä merkkiä. Näitä 22 merkkiä käytetään sitten latauslinkkien muodostukseen tyyliin https://heppa.hippos.fi/heppa/app?page=racing/
Tässä esimerkki nodejs:llä (asenna npm:llä ylimääräiset paketit request ja node-html-parser)
Koodi tsekkaa läpi käsiohjelmasisällöt, ja kopioi niistä ylläolevan antamasi linkin mukaan erillisellä tunnuksella html:t.
tuloksena siis läjä html filuja samassa kansiossa jossa pätkä ajetaan
var request = require("request"); var parse = require('node-html-parser').parse; var fs = require('fs'); request({ uri: "https://heppa.hippos.fi/heppa/racing/RaceCalendar.html", }, (error, response, body) => { if(error) { console.log('virhe nyyh: ' + error) } else { try { const page = parse(body, {script: false}) const links = page.querySelectorAll('a'); links.forEach((item) => { if(item.attributes['href'].match(/sp=/)) { let link = item.attributes['href'].split('sp=')[1] //Parsitaan ylimääräinen & merkki pois saadusta tunnisteesta link = link.substring(0, link.length - 1) request({ uri: `https://heppa.hippos.fi/heppa/app?page=racing/RaceProgramOneRace&service=external&sp=${link}&sp=CEH&sp=CC4`, }, (error, response, body) => { if(!body.match(/Tilanteen raportoiminen/)) { let kasiohjelma = parse(body).querySelector('.race_program') // Jätetään kirjoittamatta ne, jonka käsiohjelmasta ei löydy sisältöä, eli joissa palautunut html ei sisällä datarivejä race_program taulusta if(kasiohjelma.childNodes.length > 3) { fs.writeFile(`${link}.html`, body) } } else { console.log(`tiedolle ${link} ei löydy sisältöä`) } }) } }) } catch(ex) { console.log('virhe parsiessa') } } });
Upeeta ja kiitoksia pitää illalla testailla.
Äkikseltään vaikuttas toimivan muuten paitsi, että hakee turhaa 13.10 päivän. Tarkoitus oli et pelkästään sen ensimmäisen kohdalta ja sen tulevan htlm-tiedoston vois nimetä vaikka lahto1 sitten joutuu lisäämään noita =CC4,CC5,CC6...CC9 asti eli kuusilähtöä.
Lisäys: sekä taitas riittää et tulostas pelkästään tuon tablen race_program
Joo en tuota tosiaan viimeistellyt mitenkään :D
Siitä vaan muuttelemaan koodia niin saat haluamasi lopputuloksen!
Jep, mut taitaa jäädä multa tekemättä se mitä alkuperäisesti haen eli markkelina tyyppi sarakkeesta Toto65 ja samalta riviltä haetaan se 22 merkkiä linkistä.
Kun se pitäs mennä sen tekstin mukaan eli otetaan se toinen Toto76 ja sen kohtalta sitten linkin loppuosaa sen 22 merkkiä??? Mä en saa mitään järkevää toimintaa tuossakaan aikaan.
Lisäys: Helpatkaa nyt vanhusta....
en tajua mitä tarkoittaa 22 merkkiä linkistä, tuo yksilöivä tunniste ei ollut 22 merkkiä pitkä. Täällä lähinnä autetaan toisia ratkaisemaan ohjelmisto-ongelmia, ei niinkään tekemään valmista softaa tilauksesta.
Toki valmiin sovelluksenkin saat takuuvarmasti (ja arvioisin että melko edullisesti), jos tilaat sen vaikka joltain ohjelmistoputkassa kehittäjältä!
Tarkotan kun https://heppa.hippos.fi/heppa/racing/
Onko jokin erityinen syy, ettet lisää noita tarvittavia CC4 ja CC5 osuuksia ton esimerkin hakuosoitteeseen
//Tämän loppuun, tässä on hakuosoite josta nuo tiedot haetaan uri: `https://heppa.hippos.fi/heppa/app?page=racing/RaceProgramOneRace&service=external&sp=${link}&sp=CEH&sp=CC4`,
noi cc4, ja cc5 .... on lähtönumeroita niitä toki tarvitaan latuksessa lataan jokaisen lähdön sitten omana tiedostona erikseen ja tosiaan se pitäsi saada tyyppi sarakeen Toto76 ja tai Toto65 kohdalta samalta riviltä sen linkki loppuosa jolla sitten voi tehdä lataamisen koneelle. Tuon linkin lopussa oleva CEH muuttuu myös radoittaan nähtävästi tuo on vermon tunnus, mutta Toto76 ravit ei ole vermossa kun harvoin.
Niin miten se nyt sitten menis????
Jatkossa suosittelen muistamaan, että me ketkä täällä autetaan, ei suinkaan saada tästä palkkaa. Joten jos sinulla on kiire ja tarkat speksit, suosittelen ostamaan sovelluksen kehittäjältä. Lähtökohtaisesti myös valmiita koodeja on turha pyytää, niihin menee sen verran aikaa ellei kyse ole jostain pienestä pätkästä, että harva jaksaa sitä ilmaiseksi väkertää. On eri asia auttaa ohjelmistopulmassa, kuin tuottaa kokonaisuus ja opetella kaikki substansseista lähtien.
Tässä pikainen raapustus, varmasti on bugeja ja rumaa jälkeä, mutta tuottaa ulos taulut käsiohjelman lähdöistä, jos toto75 tai toto65. Linkit html:ssä eivät toimi, koska niiden href ei sisällä domainia. tämä tulisi lisätä hrefien alkuun jos haluaa niiden toimivan.
** EDIT **
Fiksasin tuon päivämäärän joka html filuissa oli viimeisen pvm:n mukaan. nyt on oikein.
Tämän enempää en jaksa tähän käyttää aikaa, jos on lisätarpeita, kannattaa joko tilata se, teettää kokonaan uudestaan jossain, tai opetella laajentamaan tuota itse.
var request = require("request"); var parse = require('node-html-parser').parse; var fs = require('fs'); request({ uri: "https://heppa.hippos.fi/heppa/racing/RaceCalendar.html", }, (error, response, body) => { if(error) { console.log('virhe nyyh: ' + error) } else { try { const page = parse(body, {script: false}) const rows = page.querySelectorAll('tr'); rows.forEach((r) => { const cols = r.querySelectorAll('td') let index = 0 var day = "" cols.forEach((col) => { if(index == 0) { let val = parse(col.toString()) day = val.rawText } index++ if(col.toString().match('Toto76') || col.toString().match('Toto65')) { const links = r.querySelectorAll('a'); links.forEach((item) => { if(item.toString().match('Käsiohjelma ja lähtölistat')) { let kasiohjelmaURL = item.attributes['href'] request({ uri: 'https://heppa.hippos.fi' + kasiohjelmaURL }, (error, response, body) => { const kasiohjelma = parse(body, {script: false}) let kasiohjelmaData = kasiohjelma.querySelector('.data') let kasiohjelmaLinks = kasiohjelmaData.querySelectorAll('a') kasiohjelmaLinks.forEach((klink) => { let name = day + '_' + klink.rawText.split(' ').join('').split('klo')[0] request({ uri: 'https://heppa.hippos.fi' + klink.attributes['href'] }, (error, response, body) => { const data = parse(body, {script: false}) const kasiohjelma = data.querySelector('.race_program') fs.writeFile(`${name}.html`, kasiohjelma.toString()) }) }) }) } }) } }) }) } catch(ex) { console.log('virhe parsiessa: ' + ex) } } });
Aihe on jo aika vanha, joten et voi enää vastata siihen.