Olen tässä jo jonkin aikaa tutkinut, miten saisi luotettavasti kaiveltua HTML-sivusta linkit. Aluksi ajattelin käyttää regexpiä, mutta ilmeisesti HTML:n parsiminen niiden avulla ei taida olla kovin hyvä idea (reaktiot on yleensä jotain tällaista). Mietin kuitenkin, että regexp saattaisi toimia tässä yksinkertaisessa tapauksessa. Web-kehitys ei ole oikein omaa alaani, joten en kuitenkaan osaa varmasti sanoa. Qt on jo käytössä, joten regexpiä varten ei tarvitsisi edes lisätä riippuvuuksia.
Tähän mennessä olen miettinyt näitä vaihtoehhtoja:
- regexp
- jokin HTML-parseri (kokeilin htmlcxx, mutta se ei jostain syystä toiminut oikein)
- muuttaa HTML validiksi XML:ksi jollain kirjastolla ja käyttää sitten XML-kirjasota sen parsimiseen
Mitä kautta tätä ongelmaa kannattaisi lähteä ratkomaan? Riittäisikö tässä tapauksessa regexpin käyttö?
Kiitos jo etukäteen.
Oma mielipiteeni on, että jos tarkoituksesi on vain ja ainoastaan kaivella HTML-dokumentista linkit, niin regexp tai muu kotikutoinen ratkaisu voi toimia riittävän hyvin. Oikea tapa on kuitenkin käyttää HTML-parseria tai kuvailemaasi Tidy + XML-parser -yhdistelmää. Voit käyttää Qt:stä löytyvää QWebElementtiä HTML-parserina:
frame->setHtml("<html><body><a href=\"www.ohjelmointiputka.net\">Putka</a><a href=\"http://google.com/\">Google</a></body></html>"); QWebElement doc = frame->documentElement(); QList<QWebElement> links = doc.findAll("a");
Dimple kirjoitti:
Mitä kautta tätä ongelmaa kannattaisi lähteä ratkomaan?
Voisi aloittaa selvittämällä, millainen kieli HTML on a) määrittelyjen mukaan ja b) käytännössä. Kumpikin tarkastelu johtaa siihen, että sitä ei kannata yrittää jäsentää säännöllisillä lausekkeilla.
Vaihtoehdon valinta riippuu lähinnä siitä, millaista HTML:ää haluat käsitellä. Mikään jäsennin ei tietenkään selviä kaikesta moskasta, mitä HTML:nä tarjoillaan. Käytännöllisin ratkaisu voi olla validator.nu:n jäsennin, http://about.validator.nu/htmlparser/ (Jos implementointikieli tuntuu väärältä, voi kysyä, valitaanko ongelma kielen mukaan vai kieli ongelman mukaan.) Käytännössä Perlin CPANista löytynee myös useimpiin tarpeisiin ihan sopiva HTML-jäsennin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.