Kaip analizuoti ir apdoroti HTML / XML PHP?

Kaip galite išanalizuoti HTML / XML ir ištraukti informaciją iš jo?

1969 m
26 авг. RobertPitt rinkėsi rugpjūčio 26 d 2010-08-26 20:17 '10, 20:17, 2010-08-26 20:17
@ 29 atsakymai

Gimtoji XML plėtiniai

Norėčiau naudoti vieną iš vietinių XML plėtinių, nes jie pridedami prie PHP, paprastai dirba greičiau nei visos trečiosios šalies bibliotekos ir man visiškai kontroliuojamas žymėjimas.

Dom

DOM plėtinys leidžia dirbti su XML dokumentais per DOM API su PHP 5. Tai W3C Core Level 3 dokumento objekto modelio, platformos ir kalbos nepriklausomos sąsajos, leidžiančios programoms ir scenarijai dinamiškai pasiekti ir atnaujinti dokumentų turinį, struktūrą ir stilių, įgyvendinimas. .

DOM gali analizuoti ir modifikuoti realaus pasaulio (nefunkcinį) HTML ir vykdyti XPath užklausas . Jis pagrįstas libxml .

Tai užtrunka šiek tiek laiko, kad taptų produktyvus su DOM, bet šį kartą tai verta IMO. Kadangi DOM yra nepriklausoma kalbų sąsaja, rasite daugelyje kalbų įdiegtų programų, todėl, jei reikia keisti programavimo kalbą, greičiausiai jau žinote, kaip naudoti šią DOM API kalbą.

Pagrindinį naudojimo pavyzdį galima rasti „A“ elemento „Hrabf“ atribute, o bendrą konceptualų apžvalgą galima rasti „ DOMDocument for php“

Kaip naudoti „DOM“ plėtinį, „StackOverflow“ yra plačiai įtrauktas , todėl, jei nuspręsite jį naudoti, galite būti tikri, kad dauguma problemų, su kuriomis susiduriate, gali būti išspręstos ieškant / peržiūrint Stack Overflow.

XMLReader

XMLReader plėtinys yra XML analizatorius. Skaitytojas veikia kaip žymeklis, einantis į priekį išilgai dokumentų srauto ir sustojęs prie kiekvieno mazgo.

XMLReader, kaip ir DOM, yra pagrįstas libxml. Nežinau, kaip paskambinti į HTML Parser modulį, todėl greičiausiai naudojant XMLReader, norint išanalizuoti sugadintą HTML, gali būti mažiau patikimas nei naudojant DOM, kur galite aiškiai pasakyti, kad naudojate „libxml HTML Parser“ modulį.

Pagrindinį naudojimo pavyzdį galima rasti, kai visos vertybės gaunamos iš h1 žymių naudojant php

XML analizatorius

Šis plėtinys leidžia sukurti XML analizatorius ir tada apibrėžti įvairių XML įvykių tvarkytojus. Kiekvienas XML analizatorius taip pat turi keletą parametrų, kuriuos galite konfigūruoti.

XML Parser biblioteka taip pat yra pagrįsta libxml ir įgyvendina XML SAX stiliaus push-analizatorių. Tai gali būti geresnis pasirinkimas atminties valdymui nei „DOM“ arba „SimpleXML“, tačiau bus sunkiau dirbti su XMLReader įdiegtu analizatoriumi.

SimpleXml

„SimpleXML“ plėtinys yra labai paprastas ir lengvai naudojamas įrankių rinkinys, skirtas XML konvertuoti į objektą, kurį galima apdoroti naudojant paprastus nuosavybės parinkiklius ir masyvo iteratorius.

SimpleXML yra parinktis, kai žinote, kad HTML yra galiojantis XHTML. Jei reikia išanalizuoti sugadintą HTML, net neatsižvelgti į „SimpleXml“, nes jis droselis.

Pagrindinį naudojimo pavyzdį galima rasti skyriuje „Paprasta programa“ CRUD mazgo ir XML failų mazgų reikšmėms, o PHP vadove yra daug daugiau pavyzdžių .


Trečiųjų šalių bibliotekos (pagal „libxml“)

Jei norite naudoti trečiosios šalies biblioteką, siūlau naudoti biblioteką, kuri faktiškai naudoja DOM / libxml, o ne analizuoti eilutę.

FluentDom - Repo

„FluentDOM“ suteikia „JQuery“ nemokamą XML sąsają „DOMDocument“ PHP. Pasirinktuvai yra parašyti XPath arba CSS (naudojant CSS į XPath konverterį). Dabartinės versijos praplečia DOM, diegia standartines sąsajas ir prideda „Living Standard DOM“ funkcijas. FluentDOM gali atsisiųsti tokius formatus kaip JSON, CSV, JsonML, RabbitFish ir kt. Galima įdiegti per Kompozitorių.

HtmlPageDom

Wa72 „HTMLmlage“ yra PHP biblioteka, skirta paprasčiausiai manipuliuoti HTML dokumentais. Norint pereiti į DOM medį, reikia iš „Symfony2“ komponentų sukurti „ DomCrawler“ ir išplėsti jį, pridedant metodus manipuliuoti HTML dokumentų DOM mediu .

phpQuery (nėra atnaujinta metų)

phpQuery yra grandininė API, pagrįsta dokumento objekto modeliu (DOM), valdoma serverio pusės parinkikliu, pagrįstu PHP5 parašyta „jQuery JavaScript“ biblioteka, ir suteikia papildomą komandinės eilutės sąsają (CLI).

Taip pat žiūrėkite: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom suteikia įrankius darbui su dokumentais ir DOM struktūromis. Šiuo metu siūlome „Zend_Dom_Query“, kuri suteikia vieningą sąsają DOM dokumentų užklausoms, naudojant „XPath“ ir „CSS“ parinkiklius.

QueryPath

QueryPath yra PHP biblioteka XML ir HTML tvarkymui. Jis skirtas dirbti ne tik su vietinėmis rinkmenomis, bet ir su interneto paslaugomis ir duomenų bazės ištekliais. Ji įgyvendina didžiąją dalį „jQuery“ sąsajos (įskaitant CSS stiliaus parinktuvus), tačiau ji labai pritaikyta naudoti serverio pusėje. Galima įdiegti per Kompozitorių.

fDOMDocument

fDOMDocument praplečia standartinį DOM, kad visose klaidose, o ne įspėjimuose ar PHP pranešimuose, būtų taikomos išimtys. Jie taip pat prideda įvairius pasirinktinius metodus ir sparčiuosius klavišus patogumui ir patogumui.

saber / xml

Saber / xml yra biblioteka, kuri paketuoja ir plečia XMLReader ir XMLWriter klases, kad sukurtų paprastą xml į objektą / masyvą. XML rašymas ir skaitymas yra vienas leidimas, todėl jis gali būti greitas ir reikalauja mažai atminties dideliems XML failams.

Fluidxml

„FluidXML“ yra PHP biblioteka, skirta manipuliuoti XML, naudojant glaustą ir nemokamą API. Jis naudoja XPath ir lankstų programavimo modelį, kad būtų įdomus ir efektyvus.


Trečioji šalis (nėra pagrįsta libxml)

Naudojant DOM / libxml privalumas yra tas, kad gausite gerų rezultatų iš dėžutės, nes esate pagrįsti savo plėtiniu. Tačiau ne visi trečiųjų šalių bibliotekos seka šį kelią. Kai kurie iš jų yra išvardyti žemiau.

PHP paprastas HTML DOM analizatorius

  • HTML DOM parser, parašytas PHP5 +, leidžia jums lengvai manipuliuoti HTML!
  • Reikia PHP 5+.
  • Palaiko neteisingą HTML.
  • Raskite HTML puslapio žymes su pasirinktimis, pvz., JQuery.
  • Ištraukite turinį iš HTML vienoje eilutėje.

Nerekomenduoju šio analizatoriaus. Kodo bazė yra baisi, ir pats skaitiklis yra gana lėtas ir reikalauja daug atminties. Ne visi jQuery selektoriai (pvz., Vaikų selektoriai ) yra įmanomi. Bet kuri „libxml“ biblioteka turėtų lengvai viršyti ją.

PHP HTML analizatorius

PHPHtmlParser yra paprastas, lankstus html analizatorius, leidžiantis pasirinkti žymas naudojant bet kurį CSS selektorių, pvz., JQuery. Tikslas - padėti kurti priemones, kurios reikalauja greitai ir lengvai atsisakyti HTML, nepriklausomai nuo to, ar jis galioja, ar ne! Šį projektą iš pradžių palaikė „sunra / php-simple-html-dom-parser“, tačiau parama atrodo nutraukta, todėl šis projektas yra mano ankstesnio darbo pritaikymas.

Vėlgi, aš nerekomenduočiau šio skaitiklio. Tai gana lėtas, kai naudojamas didelis CPU. Taip pat nėra sukurtos DOM objektų atminties valymo funkcijos. Šios problemos ypač būdingos įdėtoms kilpoms. Pati dokumentacija yra netiksli ir parašyta su klaidomis, be atsakymų į pataisas nuo balandžio 14 d. 16.

Ganonas

  • Universalus Tokenizer ir HTML / XML / RSS DOM Parser
    • Gebėjimas manipuliuoti elementais ir jų atributais
    • Palaiko negaliojančius HTML ir UTF8
  • Gali atlikti išplėstas CSS3 panašias užklausas elementuose (pvz., Palaikomos jQuery - vardų erdvės)
  • HTML beautifier (pvz., HTML Tidy)
    • Sumažinkite CSS ir „Javascript“
    • Rūšiuoti atributus, pakeiskite simbolių atvejį, teisingai įdėkite ir pan.
  • tempimas
    • Išnagrinėti dokumentus, naudojančius atgalines žinutes, remiantis dabartiniu simboliu / simboliu
    • Operacijos yra suskirstytos į mažesnes funkcijas, kad būtų lengviau apibrėžti.
  • Greitas ir paprastas

Niekada nenaudojote. Aš negaliu pasakyti, ar tai gerai.


HTML 5

Anksčiau pateiktą informaciją galite naudoti, norėdami analizuoti HTML5, tačiau kai kurie keistai yra įmanomi dėl HTML5 leistino žymėjimo. Taigi, norėdami apsvarstyti galimybę naudoti HTML5, naudokite specialią analizatorių kaip

html5lib

Įdiegia „Python“ ir „PHP“ HTML analizatorius, pagrįstus WHATWG HTML5 specifikacija, kad maksimalus suderinamumas su pagrindinėmis kompiuterio naršyklėmis.

Baigę HTML5, matome daugiau paryškintų parsų. Taip pat yra „W3“ tinklaraštis, pavadintas „ How-To“, skirtas analizuoti html 5, kurį verta patikrinti.


Žiniatinklio paslaugos

Jei jums nepatinka programavimas PHP, galite naudoti ir žiniatinklio paslaugas. Apskritai, jiems buvo labai mažai naudos, tačiau tai tik man ir mano naudojimo atvejai.

ScraperWiki .

„ScraperWiki“ išorinė sąsaja leidžia ištraukti duomenis tokia forma, kurią norite naudoti internete arba savo programose. Taip pat galite išgauti informaciją apie bet kurio grandiklio būklę.


Reguliarios išraiškos

Paskutinis ir mažiausias , galite ištraukti duomenis iš HTML naudojant įprastas išraiškas . Paprastai nerekomenduojama naudoti reguliarias išraiškas HTML.

Dauguma fragmentų, kuriuos galite rasti internete, kad atitiktų jūsų žymėjimą, yra trapi. Daugeliu atvejų jie dirba tik labai specifiniam HTML fragmentui. Nedideli žymėjimo pakeitimai, pvz., Tarpų pridėjimas bet kurioje vietoje, atributų pridėjimas ar keitimas, gali sukelti „RegEx“ gedimą, jei jis parašytas neteisingai. Turite žinoti, ką darote prieš naudodami „RegEx“ HTML.

HTML analizatoriai jau žino HTML sintaksės taisykles. Reguliarūs išraiškos turėtų būti mokomi kiekvienai naujai parašytai „RegEx“. „RegEx“ kai kuriais atvejais yra geras, bet tai tikrai priklauso nuo jūsų naudojimo atvejo.

Jūs galite parašyti patikimesnius parašus , tačiau visavertės ir patikimos vartotojo analizės rašymas su reguliariomis išraiškomis yra laiko švaistymas, kai minėtos bibliotekos jau egzistuoja ir su ja susiduria daug geriau.

Taip pat žiūrėkite „ HTML Parsing Cthulhu Path“


knygos

Jei norite išleisti šiek tiek pinigų, pažiūrėkite

Aš nesu susijęs su PHP architektu ar autoriais.

1786 m
26 авг. atsakymą pateikė Gordonas rugpjūčio 26 d. 2010-08-26 20:19 '10, 20:19, 2010-08-26 20:19

Išbandykite „ Simple HTML DOM Parser“

  • HTML DOM parser, parašytas PHP 5+, kuris leidžia lengvai manipuliuoti HTML kodu!
  • Reikalauti PHP 5 +.
  • Palaiko neteisingą HTML.
  • Raskite HTML puslapio žymes su pasirinktimis, pvz., JQuery.
  • Ištraukite turinį iš HTML vienoje eilutėje.
  • Atsisiųsti


Pavyzdžiai:

Kaip gauti HTML elementus:

 // Create DOM from URL or file $html = file_get_html('http://www.example.com/'); // Find all images foreach($html->find('img') as $element) echo $element->src . '<br>'; // Find all links foreach($html->find('a') as $element) echo $element->href . '<br>'; 


border=0

Kaip pakeisti HTML elementus:

 // Create DOM from string $html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); $html->find('div', 1)->class = 'bar'; $html->find('div[id=hello]', 0)->innertext = 'foo'; echo $html; 


border=0

Ištraukti HTML turinį:

 // Dump contents (without tags) from HTML echo file_get_html('http://www.google.com/')->plaintext; 


border=0

Slashdot grandiklis:

 // Create DOM from URL $html = file_get_html('http://slashdot.org/'); // Find all article blocks foreach($html->find('div.article') as $article) { $item['title'] = $article->find('div.title', 0)->plaintext; $item['intro'] = $article->find('div.intro', 0)->plaintext; $item['details'] = $article->find('div.details', 0)->plaintext; $articles[] = $item; } print_r($articles); 
313
26 авг. atsakymas pateikiamas Naveed 26 rug. 2010-08-26 20:18 '10, 20:18, 2010-08-26 20:18

Tiesiog naudokite DOMDocument-> loadHTML () ir atlikite su juo. libxml HTML analizavimas yra gana geras ir greitas, ir, priešingai populiariems įsitikinimams, jis neslopina iškraipyto HTML.

226
26 нояб. atsakymą pateikė Edward Z. Yang 26 lapkritis 2008-11-26 23:02 '08 at 23:02 pm 2008-11-26 23:02

Kodėl neturėtumėte jums ir kada naudoti reguliarias išraiškas?

Pirma, bendra neteisinga išraiška: reguliarios išraiškos nėra skirtos „ analizuoti “ HTML. Tačiau „Regexes“ gali išskirti duomenis. Ekstrahavimas yra tai, ką jie yra padarę. Pagrindinis trūkumas, susijęs su įprastos išraiškos HTML kodo generavimu teisinguose SGML įrankiuose arba pagrindiniuose XML parseriuose, yra jų sintaksinė pastanga ir skirtingas patikimumas.

Atsižvelgiant į kelių patikimų HTML regex išraiškų kūrimą:

 <a\s+class="?playbutton\d?[^>]+id="(\d+)".+? <a\s+class="[\w\s]*title [\w\s]*"[^>]+href="(http://[^">] )"[^>]*>([^<>] ). ? 

yra mažiau skaitomas nei paprastas phpQuery arba QueryPath ekvivalentas:

 $div->find(".stationcool a")->attr("title"); 

Tačiau yra konkrečių naudojimo būdų, kuriais jie gali padėti.

  • Daugelis DOM judėjimo sąsajų nerodo HTML komentarų, kurie kartais yra naudingesni ištraukimui. Konkrečiai, pseudo-HTML variantai <$var> arba SGML likučiai yra lengvai įpratami su reguliariais reiškiniais.
  • Dažnai reguliarios išraiškos gali išsaugoti apdorojimą. Tačiau HTML objektams dažnai reikalinga rankinė priežiūra.
  • Ir, galiausiai, dėl labai paprastų užduočių, pvz., <Img src = URL, iš tikrųjų jie yra tikėtina priemonė. Greičio pranašumas prieš SGML / XML analizatorius iš esmės yra tik šioms pagrindinėms gavybos procedūroms.

Kartais netgi rekomenduojama iš anksto ištraukti HTML fragmentą naudojant įprastas išraiškas /<!--CONTENT-->(.+?)<!--END-->/ ir apdoroti likusią dalį naudodami paprastesnes HTML analizatoriaus sąsajas.

Pastaba Aš tikrai turiu šią programą, kur kaip alternatyvą naudoju XML analizę ir reguliarias išraiškas. Praėjusią savaitę prasidėjo „PyQuery“ analizavimas, o reguliarioji išraiška vis dar dirbo. Taip, keista, ir aš to negaliu paaiškinti. Bet taip atsitiko. Todėl nebalsuokite už tikrus svarstymus, nes jis neatitinka įprastos išraiškos = blogio atm. Bet neleiskite jam balsuoti per daug. Tai tik šios temos vieta.

140
06 сент. atsakymas pateikiamas mario 06 sep. 2010-09-06 12:40 '10, 12:40, 2010-09-06 12:40

phpQuery ir QueryPath yra labai panašūs į nemokamo jQuery API atkūrimą. Štai kodėl jie yra du iš paprasčiausių būdų tinkamai analizuoti HTML PHP.

QueryPath pavyzdžiai

Iš esmės, jūs pirmą kartą sukuriate pageidaujamą DOM medį iš HTML eilutės:

  $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL 

Gautas objektas turi pilną HTML dokumento medžio vaizdą. Ją galima perkelti naudojant DOM metodus. Tačiau bendras požiūris yra naudoti tokius CSS selektorius kaip jQuery:

  $qp->find("div.classname")->children()->...; foreach ($qp->find("p img") as $img) { print qp($img)->attr("src"); } 

Iš esmės jūs norite naudoti paprastus #id ir .class žymes arba DIV - ->find() . Bet jūs taip pat galite naudoti XPath pareiškimus, kurie kartais yra greitesni. Taip pat būdingi jQuery metodai, tokie kaip ->children() ir ->text() ir ypač ->attr() , leidžia lengvai išgauti teisingus HTML fragmentus. (Ir jau buvo dekoduoti SGML objektai.)

  $qp->xpath("//div/p[1]"); // get first paragraph in a div 

„QueryPath“ taip pat leidžia įvesti naujus žymenis į srautą ( ->append ) ir tada ->writeHTML atnaujinto dokumento ( ->writeHTML ) ->writeHTML . Jis gali ne tik išanalizuoti iškraipytą HTML, bet ir įvairius XML dialektus (su vardų erdvėmis) ir netgi ištraukti duomenis iš HTML mikroformų (XFN, vCard).

  $qp->find("a[target=_blank]")->toggleClass("usability-blunder"); 

.

phpQuery arba QueryPath?

QueryPath paprastai yra geriau manipuliuoti dokumentais. Nors phpQuery taip pat įgyvendina kai kuriuos pseudo-AJAX metodus (tik HTTP užklausas), kurie yra labiau panašūs į jQuery. Sakoma, kad phpQuery dažnai yra greitesnis nei QueryPath (dėl mažiau bendrų funkcijų).

Norėdami gauti daugiau informacijos apie skirtumus, žiūrėkite šį palyginimą atgalinės kelionės mašinoje iš tagbyte.org . (Trūksta pirminio šaltinio, todėl čia yra nuoroda į internetinį archyvą. Taip, vis tiek galite rasti trūkstamų puslapių, žmonių.)

Ir čia yra išsamus „QueryPath“ pristatymas .

<strong> nauda

  • Paprastumas ir patikimumas
  • Lengva naudoti alternatyvas ->find("a img, a object, div a")
  • Tinkamas duomenų ištrynimas (lyginant su reguliariais „greping“ žodžiais)
127
07 сент. Atsakymas pateikiamas Mario 07 sep. 2010-09-07 17:45 '10, 5:45 val. 2010-09-07 17:45

Paprastas HTML DOM yra puikus atviro kodo analizatorius:

simplehtmldom.sourceforge

Jis apdoroja DOM elementus orientuotu būdu, o naujasis iteravimas turi didelę reikšmę netinkamam kodui. Taip pat yra tokių didelių funkcijų, kurias matėte „JavaScript“, pvz., „Rasti“ funkciją, kuri grąžins visus šio žymos pavadinimo elementų egzempliorius.

Aš jį panaudojau daugelyje įrankių, išbandydavau įvairius tinklalapius, ir manau, kad tai puikiai veikia.

85
16 нояб. Robert Elwell atsakymas lapkričio 16 d 2008-11-16 01:16 '08, 1:16 am 2008-11-16 01:16

Vienas bendras požiūris, kurį čia nenurodiau , yra paleisti HTML per Tidy , kurį galima nustatyti, galiojantį XHTML. Tada galite naudoti bet kurią seną XML biblioteką.

Tačiau, norėdami išspręsti šią problemą, turėtumėte pažvelgti į šį projektą: http://fivefilters.org/content-only/ yra modifikuota „ Skaitymo“ versija, sukurta ištraukti tik tekstinį turinį (o ne antraštes ir poraštes) iš puslapio.

58
01 мая '11 в 5:04 2011-05-01 05:04 atsakymas duotas Eli 01 gegužės 11 d. 5:04 2011-05-01 05:04

1a ir 2 atveju: balsuosiu už naujos klasės DOMCrawler klasės simfoniją ( DomCrawler ). Ši klasė leidžia užklausas, panašias į „CSS Selectors“. Pažvelkite į šį realaus pasaulio pavyzdžių pristatymą: „ simfonijos 2“ pasaulį .

Komponentas skirtas dirbti neprisijungus ir gali būti naudojamas be simfonijos.

Vienintelis trūkumas yra tai, kad jis veiks tik su PHP 5.3 ar naujesne.

54
06 сент. Atsakyti Timo 06 sept. 2010-09-06 12:19 '10, 12:19, 2010-09-06 12:19

Tai paprastai vadinama ekrano grandikliu . Biblioteka, kurią naudoju, yra paprastas HTML analizatorius .

51
26 авг. Joel Verhagen atsakymas, pateiktas rugpjūčio 26 d 2010-08-26 20:20 '10, 20:20, 2010-08-26 20:20

Mūsų reikmėms sukūrėme nemažai skaitytuvų. Galų gale, tai paprastai yra paprastos reguliarios išraiškos, kurios daro viską geriau. Nors pirmiau išvardytos bibliotekos yra tinkamos dėl to, kad jos sukurtos, jei žinote, ko ieškote, reguliarios išraiškos yra saugesnis būdas, nes taip pat galite apdoroti negaliojančias HTML / XHTML struktūras, kurios nepavyks, jei jos bus įkeltos per daugumą analizatorių .

40
04 окт. atsakymas pateikiamas jancha 04 okt. 2011-10-04 16:14 '11, 16:14 PM 2011-10-04 16:14

Aš rekomenduoju PHP paprastą HTML DOM analizatorių .

Ji turi gražių funkcijų, pavyzdžiui:

 foreach($html->find('img') as $element) echo $element->src . '<br>'; 
37
07 нояб. Atsakyti Greg 07 Nov. 2012-11-07 00:02 '12 - 0:02 2012-11-07 00:02

Tai skamba kaip geras darbas, apibūdinantis W3C XPath technologiją. Paprasta išreikšti prašymus, pavyzdžiui, „grąžinti visus„ href atributus į„ img žymes, kurios yra įtrauktos į <foo><bar><baz> elements “. Nesate PHP šnipinėjimo, aš negaliu pasakyti, kokia forma gali būti XPath. Если вы можете вызвать внешнюю программу для обработки HTML файла, вы сможете использовать версию командной строки XPath. Для быстрого ввода см. http://en.wikipedia.org/wiki/XPath .

35
ответ дан Jens 14 апр. '11 в 22:08 2011-04-14 22:08

Сторонние альтернативы SimpleHtmlDom, которые используют DOM вместо String Parsing: phpQuery , Zend_Dom , QueryPath и FluentDom .

28
ответ дан danidacar 07 сент. '10 в 11:57 2010-09-07 11:57