| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Keskustelut - PHP - Paras tapa parsia (X)HTML dokumenttiarso 15:25 5.2.10 Terve, Mikä on paras tapa parsia HTML -dokumentista paljon erilaisia osia. Pitäisi löytää tapa joka olisi a) todella nopea b) monipuolinen ja joustava. Olen ajatellu jotain näistä: - regexp tai vastaava joka ei ota mitään kantaa itse xml rakenteeseen - joku PHP:n sisäänrakennettu DOM tai XML parseri - joku kolmannen osapuolen tekemä DOM tai XML parseri - XPATH - Joku muu? rso 15:32 5.2.10 Mainitaan vielä että nyt haen ehdottomasti sitä prosessoriaikaa vähiten kuluttavaa tapaa sillä tietomäärät ovat valtavia ja pienikin nopeusero kertautuu suureksi. weicco 15:45 5.2.10 HTML dokumentti ei ole XML:ää. XHTML on, mutta en luottaisi siihen, että se on well-formedia tai puhumattakaan, että validia. Regexpit jäävät siis jäljelle. editoitu: 15:58 5.2.10 rso 15:46 5.2.10 No sanotaan sitten mikä olisi paras tapa parsia well-formed xhtml:ää? Tosin kyllähän "rumimmankin" HTML-dokumentin elementteihin voi päästä käsiksi DOM:a käyttäen. Hyvä esimerkki tästä on javascript jota käytettiin jo ennen XHTML:ää. Joten onko olemassa PHP:lle jotain järkevää tapaa parsia HTML tai XHTML dokumentteja. Regexpit mielellään jättäisin viimeiseksi vaihtoehdoksi. editoitu: 16:05 5.2.10 eis 16:04 5.2.10 weicco kirjoitti: HTML dokumentti ei ole XML:ää. XHTML on, mutta en luottaisi siihen, että se on well-formedia tai puhumattakaan, että validia. Regexpit jäävät siis jäljelle. Onhan sitä muitakin vaihtoehtoja, sellaisia, jotka on tarkoitettu nimenomaan html-mössön parsimiseen. BeautifulSoup on yksi mainittava tässä yhteydessä, mut se on eri kielelle - tuolla muutama vaihtoehto PHP:lle. Noista ehdotetuista äkkipäätä phpquery näytti houkuttelevimmalta. rso 16:22 5.2.10 eis kirjoitti: weicco kirjoitti: HTML dokumentti ei ole XML:ää. XHTML on, mutta en luottaisi siihen, että se on well-formedia tai puhumattakaan, että validia. Regexpit jäävät siis jäljelle. Onhan sitä muitakin vaihtoehtoja, sellaisia, jotka on tarkoitettu nimenomaan html-mössön parsimiseen. BeautifulSoup on yksi mainittava tässä yhteydessä, mut se on eri kielelle - tuolla muutama vaihtoehto PHP:lle. Noista ehdotetuista äkkipäätä phpquery näytti houkuttelevimmalta. Tuosta nyt ei osaa sanoa kuinka raskaita nuo on käyttää. Kyllä menee vaikeaksi. editoitu: 18:26 5.2.10 ddf 18:21 5.2.10 Mikäli toteutuksen haluaa hoitaa alusta saakka itse, niin kätevimmin homma hoituu hyödyntämällä tietorakennetta pino. Tällöin esimerkiksi dokumentin validointi hoituisi niin, että kun uusi aloittava tagi <...> tulee vastaan niin se lisätään pinoon. Kun taas sitten seuraava lopettava tagi </...> tulee vastaan, niin sen vastakohdan <...> täytyy olla nyt pinon päällimmäisenä tai muuten dokumentti ei ole validi. Mikäli oikea vastaava tagi oli päällimmäisenä, niin se poistetaan pinosta. Homma jatkuu kunnes dokumentti on luettu ja pino on tyhjä (jos pino ei jää tyhjäksi, niin jokin tagi on unohtunut sulkea). Tämä ei tietenkään vielä osaa ottaa kantaa siihen, ovat tagit sallitussa järjestyksessä (esim. tuliko <body> ennen <html>), mutta World Wide Web Consortium kyllä tarjoaa siihen hyvät dokumentit :) Validointia suoritettaessa voidaan samalla tallentaa sisältö. Pinossa olevat tagit kertovat, missä kohtaa dokumenttia ollaan. Jos html-dokumentti olisi esimerkiksi HTML ja tultaessa otsikon "Hello World!" kohdalle pinossa olisi pohjimmaisena <html>, sitten <head> ja sitten <title>, jolloin sisältö ja sen kohta dokumentissa on helppo tallentaa. XHTML sitten tietenkin sisältää myös muotoa <... /> olevia tageja, joiden käsittely oikein pitäisi muistaa. Tällaisen toteutuksen pahin mahdollinen aikavaativuus lienee O(n), joka taitanee olla optimaalisin mahdollinen. Tukki 19:38 5.2.10 Veikkaan että hyvin suurella todennäköisyydellä itse tehty parseri ei ole tehokkaampi kuin jokin vapaasti saatavilla oleva valmis vaihtoehto. editoitu: 16:47 6.2.10 eis 16:45 6.2.10 ddf kirjoitti: Mikäli toteutuksen haluaa hoitaa alusta saakka itse, niin kätevimmin homma hoituu hyödyntämällä tietorakennetta pino. Tällöin esimerkiksi dokumentin validointi hoituisi niin, että kun uusi aloittava tagi <...> tulee vastaan niin se lisätään pinoon. Kun taas sitten seuraava lopettava tagi </...> tulee vastaan, niin sen vastakohdan <...> täytyy olla nyt pinon päällimmäisenä tai muuten dokumentti ei ole validi. Mikäli oikea vastaava tagi oli päällimmäisenä, niin se poistetaan pinosta. Homma jatkuu kunnes dokumentti on luettu ja pino on tyhjä (jos pino ei jää tyhjäksi, niin jokin tagi on unohtunut sulkea). Itse ymmärsin alkuperäisen kysymyksen niin, että HTML-dokumentista haluttiin erilaisia osia ulos, eikä niinkään käpistellä dokumenttia kokonaisuudessaan. Kyllähän myös epävalideista HTML-dokumenteista halutaan tavaraa ulos. Ehkä pinoa siihenkin vois käyttää tietorakenteena, mutta äkkipäätä kuulostais aika paljon rajoittuneemmalta rajapinnalta kuin mitä noissa valmiissa pulikoissa on. rso kirjoitti: Tuosta nyt ei osaa sanoa kuinka raskaita nuo on käyttää. Kyllä menee vaikeaksi. Testaamallahan se selviää. |
![]() Haku
|