ඔබ PHP හි HTML / XML විග්‍රහ කර සකසන්නේ කෙසේද?


Answers:


1901

ස්වදේශීය XML දිගු

මම කැමතියි ස්වදේශික එක්ස්එම්එල් දිගුවක් PHP සමඟ බැඳී ඇති බැවින් ඒවා සාමාන්‍යයෙන් තෙවන පාර්ශවීය ලිබ් වලට වඩා වේගවත් වන අතර සලකුණු කිරීම සඳහා මට අවශ්‍ය සියලු පාලනය ලබා දෙන්න.

DOM

DOM දිගුව මඟින් PHP 5 සමඟ DOM API හරහා XML ලේඛන මත ක්‍රියා කිරීමට ඉඩ ලබා දේ. එය W3C හි ලේඛන වස්තු ආකෘති මූලික මට්ටම 3, වේදිකාවක් සහ භාෂා-උදාසීන අතුරුමුහුණතක් ක්‍රියාත්මක කිරීමකි. ලේඛනවල අන්තර්ගතය, ව්‍යුහය සහ ශෛලිය.

ඩොම්ට සැබෑ ලෝකයේ (බිඳුණු) HTML විග්‍රහ කිරීමට සහ වෙනස් කිරීමට හැකියාවක් ඇති අතර එයට XPath විමසුම් කළ හැකිය . එය libxml මත පදනම් වේ .

DOM සමඟ tive ලදායී වීමට යම් කාලයක් ගත වේ, නමුත් එම කාලය IMO සඳහා එය වටී. DOM යනු භාෂා-අ nost ෙයවාදී අතුරු මුහුණතක් බැවින්, ඔබ බොහෝ භාෂාවලින් ක්‍රියාත්මක කිරීම් සොයා ගනු ඇත, එබැවින් ඔබට ඔබේ ක්‍රමලේඛන භාෂාව වෙනස් කිරීමට අවශ්‍ය නම්, එම භාෂාවේ DOM API භාවිතා කරන්නේ කෙසේදැයි ඔබ දැනටමත් දැන ගනු ඇත.

මූලද්‍රව්‍යයක href ගුණාංගය උදුරා ගැනීමේදී මූලික භාවිත උදාහරණයක් සොයාගත හැකි අතර සාමාන්‍ය සංකල්පීය දළ විශ්ලේෂණයක් php හි DOMDocument වෙතින් සොයාගත හැකිය.

DOM දිගුව භාවිතා කරන්නේ කෙසේද යන්න StackOverflow හි පුළුල් ලෙස ආවරණය කර ඇත , එබැවින් ඔබ එය භාවිතා කිරීමට තෝරා ගන්නේ නම්, ඔබ විසින් පැන නගින බොහෝ ගැටලු විසඳා ගත හැකි බව ඔබට සහතික විය හැකිය.

XMLReader

XMLReader දිගුව යනු XML අදින්න විග්‍රහයකි. පා er කයා කර්සරයක් ලෙස ක්‍රියා කරන්නේ ලේඛන ප්‍රවාහයේ ඉදිරියට යන අතර මඟෙහි සෑම නෝඩයකම නතර වේ.

DOM වැනි XMLReader, libxml මත පදනම් වේ. HTML පාර්සර් මොඩියුලය අවුලුවන්නේ කෙසේදැයි මම නොදනිමි, එබැවින් බිඳුණු HTML විග්‍රහ කිරීම සඳහා XMLReader භාවිතා කිරීමේ අවස්ථා DOM භාවිතා කිරීමට වඩා ශක්තිමත් විය හැකි අතර එහිදී ඔබට libxml හි HTML Parser මොඩියුලය භාවිතා කිරීමට පැහැදිලිවම පැවසිය හැකිය.

Php භාවිතා කරමින් h1 ටැග් වලින් සියලු අගයන් ලබා ගැනීමේදී මූලික භාවිත උදාහරණයක් සොයාගත හැකිය

XML පාර්සර්

මෙම දිගුව මඟින් ඔබට XML විග්‍රහයන් නිර්මාණය කිරීමට සහ විවිධ XML සිදුවීම් සඳහා හසුරුවන්නන් අර්ථ දැක්වීමට ඉඩ දෙයි. සෑම එක්ස්එම්එල් විග්‍රහයකම ඔබට සකස් කළ හැකි පරාමිති කිහිපයක් ද ඇත.

එක්ස්එම්එල් පාර්සර් පුස්තකාලය ද ලිබෙක්ස්එම්එල් මත පදනම් වී ඇති අතර SAX විලාසිතාවේ එක්ස්එම්එල් තල්ලු විග්‍රහකය ක්‍රියාත්මක කරයි. එය DOM හෝ SimpleXML වලට වඩා මතක කළමනාකරණය සඳහා වඩා හොඳ තේරීමක් විය හැකි නමුත් XMLReader විසින් ක්‍රියාත්මක කරන ලද අදින්න විග්‍රහයට වඩා වැඩ කිරීමට අපහසු වනු ඇත.

SimpleXml

සාමාන්‍ය දේපල තේරීම් කරුවන් හා අරා ඉරේටරයන් සමඟ සැකසිය හැකි වස්තුවක් බවට XML පරිවර්තනය කිරීම සඳහා සරල XML දිගුව ඉතා සරල හා පහසුවෙන් භාවිතා කළ හැකි මෙවලම් කට්ටලයක් සපයයි.

සරල XML යනු HTML වලංගු XHTML බව ඔබ දන්නා විට විකල්පයකි. ඔබට බිඳුණු HTML විග්‍රහ කිරීමට අවශ්‍ය නම්, SimpleXml පවා නොසලකන්න.

මූලික භාවිතය උදාහරණයක් සොයා ගත හැක xml ගොනුව කාර්යයන් කැ ගැනීම සඳහා CRUD node එකක් මතම ඊට අදාල සහ node එකක් මතම ඊට අදාල අගයන් සරල වැඩසටහන හා පවතින අත්පොත, PHP අතිරේක උදාහරණ ගොඩක් .


තෙවන පාර්ශවීය පුස්තකාල (libxml පදනම් කරගත්)

ඔබ තෙවන පාර්ශවීය ලිබ් භාවිතා කිරීමට කැමති නම් , නූල් විග්‍රහ කිරීම වෙනුවට යටින් DOM / libxml භාවිතා කරන lib භාවිතා කිරීමට මම යෝජනා කරමි .

FluentDom - Repo

FluentDOM විසින් PHP හි DOMDocument සඳහා jQuery වැනි චතුර XML අතුරු මුහුණතක් සපයයි. තේරීම් කරන්නන් XPath හෝ CSS වලින් ලියා ඇත (CSS සිට XPath පරිවර්තකය භාවිතා කරමින්). වත්මන් අනුවාදයන් සම්මත අතුරුමුහුණත් ක්‍රියාත්මක කරන DOM දීර් extend කරන අතර DOM ජීවන ප්‍රමිතියෙන් විශේෂාංග එකතු කරයි. FluentDOM හට JSON, CSV, JsonML, RabbitFish වැනි ආකෘති පූරණය කළ හැකිය. රචනා හරහා ස්ථාපනය කළ හැකිය.

HtmlPageDom

Wa72 \ HtmlPageDom` යනු HTML ලේඛන පහසුවෙන් හැසිරවීම සඳහා වන PHP පුස්තකාලයකි. එයට DOM ගස හරහා ගමන් කිරීම සඳහා Symfony2 සංරචක වලින් DomCrawler අවශ්‍ය වන අතර HTML ලේඛනවල DOM ගස හැසිරවීමේ ක්‍රම එකතු කිරීමෙන් එය දිගු කරයි.

phpQuery (වසර ගණනාවක් තිස්සේ යාවත්කාලීන කර නොමැත)

phpQuery යනු PHP5 හි ලියා ඇති jQuery ජාවාස්ක්‍රිප්ට් පුස්තකාලය මත පදනම් වූ සේවාදායක පාර්ශවීය, දාම කළ හැකි, CSS3 තේරීම් මඟින් මෙහෙයවන ලේඛන වස්තු ආකෘතිය (DOM) API වන අතර අතිරේක විධාන රේඛා අතුරුමුහුණත (CLI) සපයයි.

මෙයද බලන්න: https://github.com/electrolinux/phpquery

සෙන්ඩ්_ඩොම්

Zend_Dom DOM ලේඛන සහ ව්‍යුහයන් සමඟ වැඩ කිරීම සඳහා මෙවලම් සපයයි. දැනට, අපි Xnd_Dom_Query පිරිනමන්නෙමු, එය XPath සහ CSS තේරීම් දෙකම භාවිතා කරමින් DOM ලේඛන විමසීමට ඒකාබද්ධ අතුරු මුහුණතක් සපයයි.

QueryPath

QueryPath යනු XML සහ HTML හැසිරවීම සඳහා වන PHP පුස්තකාලයකි. එය සැලසුම් කර ඇත්තේ දේශීය ලිපිගොනු සමඟ පමණක් නොව, වෙබ් සේවා සහ දත්ත සමුදා සම්පත් සමඟ ද ක්‍රියා කිරීමට ය. එය jQuery අතුරුමුහුණත (CSS විලාසිතාවේ තේරීම් කාරක ඇතුළුව) බොහෝමයක් ක්‍රියාත්මක කරයි, නමුත් එය සේවාදායක පාර්ශවීය භාවිතය සඳහා දැඩි ලෙස සුසර කර ඇත. රචනා හරහා ස්ථාපනය කළ හැකිය.

fDOM ලේඛනය

PHP අනතුරු ඇඟවීම් හෝ දැන්වීම් වෙනුවට දෝෂ වල සෑම අවස්ථාවකම ව්‍යතිරේක භාවිතා කිරීමට fDOMDocument සම්මත DOM දිගු කරයි. ඔවුන් පහසුව සඳහා සහ DOM භාවිතය සරල කිරීම සඳහා විවිධ අභිරුචි ක්‍රම සහ කෙටිමං එකතු කරයි.

saber / xml

saber / xml යනු සරල "xml to object / array" සිතියම්කරණ පද්ධතියක් සහ සැලසුම් රටාවක් නිර්මාණය කිරීම සඳහා XMLReader සහ XMLWriter පන්ති ඔතා පුළුල් කරන පුස්තකාලයකි. එක්ස්එම්එල් ලිවීම සහ කියවීම තනි පාස් එකක් වන අතර එම නිසා වේගවත් විය හැකි අතර විශාල එක්ස්එම්එල් ලිපිගොනු වල අඩු මතකයක් අවශ්‍ය වේ.

FluidXML

FluidXML යනු සංක්ෂිප්ත හා චතුර කථික API සමඟ XML හැසිරවීම සඳහා වන PHP පුස්තකාලයකි. එය එක්ස්පාත් සහ චතුර ලෙස ක්‍රමලේඛන රටාව විනෝදජනක හා .ලදායී බවට පත් කරයි.


තෙවන පාර්ශවයක් (libxml මත පදනම් වූවක් නොවේ)

DOM / libxml මත ගොඩනැඟීමේ වාසිය නම් ඔබ දේශීය දිගුවක් මත පදනම් වී ඇති නිසා ඔබට හොඳ කාර්ය සාධනයක් ලබා ගත නොහැකි වීමයි. කෙසේ වෙතත්, සියලුම තෙවන පාර්ශවීය ලිබ්ස් මෙම මාර්ගයෙන් බැස නොයයි. ඒවායින් සමහරක් පහත ලැයිස්තු ගත කර ඇත

PHP සරල HTML DOM විග්‍රහකය

  • PHP5 + හි ලියා ඇති HTML DOM විග්‍රහකය ඔබට HTML ඉතා පහසුවෙන් හැසිරවීමට ඉඩ දෙයි!
  • PHP 5+ අවශ්‍යයි.
  • අවලංගු HTML සඳහා සහය දක්වයි.
  • JQuery වැනි තේරීම්කරුවන් සමඟ HTML පිටුවක ටැග් සොයා ගන්න.
  • HTML වෙතින් අන්තර්ගතයන් තනි පේළියකින් උපුටා ගන්න.

මම සාමාන්‍යයෙන් මෙම විග්‍රහකය නිර්දේශ නොකරමි. කේත රචනය භයානක වන අතර විග්‍රහකයා තරමක් මන්දගාමී වන අතර මතකය බඩගිනි වේ. සියලුම jQuery තේරීම්කරුවන්ට ( ළමා තේරීම්කරුවන් වැනි ) හැකි නොවේ. ඕනෑම libxml පදනම් කරගත් පුස්තකාල මෙය පහසුවෙන් අභිබවා යා යුතුය.

PHP Html පාර්සර්

PHPHtmlParser යනු සරල, නම්‍යශීලී, html විග්‍රහයක් වන අතර එමඟින් jQuery වැනි ඕනෑම CSS තේරීමක් භාවිතා කර ටැග් තෝරා ගැනීමට ඉඩ ලබා දේ. Html වලංගු හෝ වේවා, ඉක්මණින්, පහසු ක්‍රමයක් අවශ්‍ය වන මෙවලම් සංවර්ධනය කිරීමට සහාය වීම මෙහි අරමුණයි! මෙම ව්‍යාපෘතියට මුලින් සහාය දැක්වූයේ සන්රා / පීඑච්පී-සිම්පල්-එච්එම්එල්-ඩොම්-පාර්සර් ය. එහෙත් සහයෝගය නතර වී ඇති බව පෙනේ.

නැවතත්, මම මෙම විග්‍රහකය නිර්දේශ නොකරමි. ඉහළ CPU භාවිතය සමඟ එය තරමක් මන්දගාමී වේ. සාදන ලද DOM වස්තූන්ගේ මතකය ඉවත් කිරීමට කිසිදු කාර්යයක් නොමැත. මෙම ගැටළු විශේෂයෙන් කැදැලි වළළු සමඟ පරිමාණය කරයි. ප්‍රලේඛනය සාවද්‍ය හා අක්ෂර වින්‍යාසය සහිත වන අතර, අප්‍රේල් 14 සිට නිවැරදි කිරීම් සඳහා ප්‍රතිචාර නොමැත.

ගනොන්

  • විශ්ව ටෝකනයිසර් සහ HTML / XML / RSS DOM විග්‍රහකය
    • මූලද්රව්ය සහ ඒවායේ ගුණාංග හැසිරවීමේ හැකියාව
    • අවලංගු HTML සහ UTF8 සඳහා සහය දක්වයි
  • මූලද්‍රව්‍ය පිළිබඳ උසස් CSS3 වැනි විමසුම් සිදු කළ හැකිය (jQuery වැනි - නාම අවකාශයන් සහාය දක්වයි)
  • HTML රූපලාවණ්‍ය යන්ත්‍රයක් (HTML පිළිවෙලට වැනි)
    • CSS සහ Javascript අවම කරන්න
    • ගුණාංග වර්ග කිරීම, අක්ෂර නඩුව වෙනස් කිරීම, නිවැරදි ඉන්ඩෙන්ටේෂන් යනාදිය.
  • විස්තාරණය කළ හැකිය
    • වත්මන් චරිතය / ටෝකනය මත පදනම්ව ඇමතුම් ලබාගෙන ලේඛන විග්‍රහ කිරීම
    • පහසුවෙන් අභිබවා යාම සඳහා කුඩා කාර්යයන් වලින් වෙන් කරන ලද මෙහෙයුම්
  • වේගවත් හා පහසුය

කිසි විටෙකත් එය භාවිතා නොකළේය. එය හොඳ දැයි කිව නොහැක.


HTML 5

HTML5 විග්‍රහ කිරීම සඳහා ඔබට ඉහත භාවිතා කළ හැකිය, නමුත් HTML5 ඉඩ සලසන සලකුණු කිරීම නිසා විචක්ෂණ විය හැකිය . එබැවින් HTML5 සඳහා ඔබට විශේෂිත පාර්සර් භාවිතා කිරීම වැනි සලකා බැලිය යුතුය

html5lib

ප්‍රධාන ඩෙස්ක්ටොප් වෙබ් බ්‍රව්සර් සමඟ උපරිම ගැළපුම සඳහා WHATWG HTML5 පිරිවිතර මත පදනම් වූ HTML විග්‍රහයක පයිතන් සහ PHP ක්‍රියාත්මක කිරීම.

HTML5 අවසන් වූ පසු අපට වඩාත් කැපවූ පාර්සර් දැකිය හැකිය. W3 හි HTML 5 විග්‍රහ කිරීම සඳහා How-To නම් වූ බ්ලොග් පෝස්ට් එකක් ද තිබේ.


වෙබ් සේවා

ඔබට PHP ක්‍රමලේඛනය කිරීමට දැනෙන්නේ නැත්නම්, ඔබට වෙබ් සේවා ද භාවිතා කළ හැකිය. පොදුවේ ගත් කල, මේවා සඳහා මට ඇත්තේ ඉතා අල්ප උපයෝගීතාවකි, නමුත් එය මා සහ මගේ භාවිත අවස්ථා පමණි.

ScraperWiki .

ScraperWiki හි බාහිර අතුරුමුහුණත මඟින් ඔබට වෙබයේ හෝ ඔබේම යෙදුම්වල භාවිතා කිරීමට අවශ්‍ය ස්වරූපයෙන් දත්ත උකහා ගැනීමට ඉඩ ලබා දේ. ඔබට ඕනෑම සීරීම්කරුවෙකුගේ තත්වය පිළිබඳ තොරතුරු උකහා ගත හැකිය.


නිත්‍ය ප්‍රකාශන

අවසාන සහ අවම වශයෙන් නිර්දේශිත , ඔබට සාමාන්‍ය ප්‍රකාශන සමඟ HTML වෙතින් දත්ත උකහා ගත හැකිය . සාමාන්‍යයෙන් HTML හි නිත්‍ය ප්‍රකාශන භාවිතා කිරීම අධෛර්යමත් කරනු ලැබේ.

සලකුණු කිරීම ගැලපීම සඳහා ඔබ වෙබයේ සොයා ගන්නා බොහෝ කොටස් අස්ථාවර වේ. බොහෝ අවස්ථාවන්හීදී ඔවුන් වැඩ කරන්නේ විශේෂිත HTML කෑල්ලක් සඳහා පමණි. ටැග් එකක සුදු අවකාශය එක් කිරීම, හෝ ටැගයක ගුණාංග එකතු කිරීම හෝ වෙනස් කිරීම වැනි කුඩා සලකුණු වෙනස්වීම්, රෙජෙක්ස් නිසි ලෙස ලියා නොමැති විට එය අසාර්ථක වීමට හේතු වේ. HTML හි RegEx භාවිතා කිරීමට පෙර ඔබ කරන්නේ කුමක්දැයි ඔබ දැන සිටිය යුතුය.

HTML විග්‍රහ කරන්නන් දැනටමත් HTML හි සින්ටැක්ටිකල් නීති දන්නවා. ඔබ ලියන සෑම නව RegEx සඳහාම නිත්‍ය ප්‍රකාශන ඉගැන්විය යුතුය. RegEx සමහර අවස්ථාවල හොඳයි, නමුත් එය ඇත්ත වශයෙන්ම ඔබගේ භාවිත අවස්ථාව මත රඳා පවතී.

ඔබට වඩාත් විශ්වාසදායක පාර්සර් ලිවිය හැකිය , නමුත් නිත්‍ය ප්‍රකාශන සමඟ සම්පූර්ණ හා විශ්වාසදායක අභිරුචි විග්‍රහයක් ලිවීම ඉහත සඳහන් පුස්තකාල දැනටමත් පවතින අතර මේ පිළිබඳව වඩා හොඳ කාර්යයක් කරන කාලය නාස්තියකි.

ද බලන්න අන්තහ්කරණය HTML වලින් මෙම Cthulhu මාර්ගය


පොත්

ඔබට යම් මුදලක් වියදම් කිරීමට අවශ්‍ය නම්, බලන්න

මම PHP ගෘහ නිර්මාණ ශිල්පියා හෝ කතුවරුන් සමඟ සම්බන්ධ වී නොමැත.


10
ඔබේ අවශ්‍යතා මත රඳා පවතී. මට CSS තේරීම් විමසීම් අවශ්‍ය නොවේ, ඒ නිසා මම XPath සමඟ පමණක් DOM භාවිතා කරමි. phpQuery හි අරමුණ jQuery වරායක් වීමයි. Zend_Dom සැහැල්ලුයි. ඔබ වඩාත්ම කැමති කුමන එකක් දැයි බැලීමට ඔබ ඒවා පරීක්ෂා කර බැලිය යුතුය.
ගෝර්ඩන්

2
@ Ms2ger බොහෝ දුරට, නමුත් සම්පූර්ණයෙන්ම නොවේ. දැනටමත් ඉහත පෙන්වා දී ඇති පරිදි, ඔබට libxml පදනම් කරගත් පාර්සර් භාවිතා කළ හැකි නමුත් ඒවා යටපත් වන විශේෂ අවස්ථා තිබේ. ඔබට උපරිම අනුකූලතාවයක් අවශ්‍ය නම් ඔබ කැපවූ පාර්සර් සමඟ වඩා හොඳය. වෙනස තබා ගැනීමට මම කැමතියි.
ගෝර්ඩන්

9
PHP සරල HTML DOM පාර්සර් භාවිතා නොකිරීම පිළිබඳ ඔබේ අදහස වැදගත් වේ.
පෙටා

3
2012 මාර්තු 29 වන විට, DOM html5 සඳහා සහය නොදක්වයි, XMLReader HTML සඳහා සහය නොදක්වන අතර PHP සඳහා html5lib සඳහා අවසන් වරට කැපවීම 2009 සැප්තැම්බර් මස වේ. HTML5, HTML4 සහ XHTML විග්‍රහ කිරීමට භාවිතා කළ යුත්තේ කුමක්ද?
ෂිප්ලු මොකාඩිම්

4
@ නාෂා මම හිතාමතාම ඉහත ලැයිස්තුවෙන් කුප්‍රකට සැල්ගෝ රැන්ට් එක බැහැර කර ඇති අතර එය තනිවම ප්‍රයෝජනවත් නොවන නිසාත් එය ලියා ඇති දා සිට යම් භාණ්ඩ ප්‍රවාහනයකට මග පාදයි. රීජෙක්ස් විසඳුමක් ලෙස කෙතරම් උචිත වුවත්, එම සබැඳිය සමඟ මිනිසුන් කම්පා විය. වඩාත් සමබර මතයක් සඳහා, කරුණාකර මා වෙනුවට ඇතුළත් කළ සබැඳිය බලන්න සහ stackoverflow.com/questions/4245008/…
ගෝර්ඩන්

322

සරල HTML DOM විග්‍රහකය උත්සාහ කරන්න

  • HTML ඉතා පහසුවෙන් හැසිරවීමට ඔබට ඉඩ සලසන PHP 5+ හි ලියා ඇති HTML DOM විග්‍රහකය!
  • PHP 5+ අවශ්‍යයි.
  • අවලංගු HTML සඳහා සහය දක්වයි.
  • JQuery වැනි තේරීම්කරුවන් සමඟ HTML පිටුවක ටැග් සොයා ගන්න.
  • HTML වෙතින් අන්තර්ගතයන් තනි පේළියකින් උපුටා ගන්න.
  • බාගත


උදාහරණ:

HTML අංග ලබා ගන්නේ කෙසේද:

// 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>';


HTML අංග වෙනස් කරන්නේ කෙසේද:

// 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;


HTML වෙතින් අන්තර්ගතය උපුටා ගන්න:

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


ස්ලෑෂ්ඩොට් සීරීම:

// 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);

8
පළමුවෙන්ම, නරක ඩීඑම්එස්, ඉන්වොලිඩ් කේතය, ඩීඑන්එස්බීඑල් එන්ජිමට එරෙහිව විශ්ලේෂණය කිරීම වැනි දේ සඳහා මා සූදානම් කළ යුතු දේ තිබේ, මෙය අනිෂ්ට අඩවි / අන්තර්ගතයන් සොයා බැලීමට ද භාවිතා කරනු ඇත, එසේම මම මගේ වෙබ් අඩවිය රාමුවක් වටා ගොඩනගා ඇති පරිදි එය පිරිසිදු, කියවිය හැකි සහ හොඳින් ව්‍යුහගත කර තිබිය යුතුය. සිම්පල් ඩිම් නියමයි නමුත් කේතය තරමක්
අවුල් සහගතයි

9
Ob රොබට් ඔබට ආරක්ෂාව සම්බන්ධ දේවල් සඳහා htmlpurifier.org ද බැලීමට අවශ්‍ය විය හැකිය .
ගෝර්ඩන්

3
ඔහුට එක් වලංගු කරුණක් තිබේ: සරල HTMLDOM දිගු කිරීම අසීරු ය, ඔබ සැරසිලි රටාවක් භාවිතා නොකරන්නේ නම්, එය මට නොසැලකිලිමත් ය. යටින් පවතින පංතියේ (එස්) වෙනස්කම් කිරීම පමණක් මා වෙවුලයි .
එරික්

1
මම කළේ සිම්පල් ඩොම් වෙත යැවීමට පෙර මගේ HTML එක පිළිවෙලට ධාවනය කිරීමයි.
MB34

1
මම දැනට මෙය භාවිතා කරමින්, යූආර් සිය ගණනක් සැකසීමේ ව්‍යාපෘතියක කොටසක් ලෙස එය ක්‍රියාත්මක කරමි. එය ඉතා මන්දගාමී වෙමින් පවතින අතර නිතිපතා කල් ඉකුත් වීම දිගටම පවතී. එය විශිෂ්ට ආරම්භක පිටපතක් වන අතර ඉගෙනීමට ඉතා සරල ය, නමුත් වඩා දියුණු ව්‍යාපෘති සඳහා මූලික වේ.
luke_mclachlan

236

DOMDocument-> loadHTML () භාවිතා කර එය සමඟ කරන්න. libxml හි HTML විග්‍රහ කිරීමේ ඇල්ගොරිතම තරමක් හොඳ සහ වේගවත් වන අතර ජනප්‍රිය විශ්වාසයන්ට පටහැනිව, විකෘති HTML වලට යටපත් නොවේ.


19
සැබෑ. තවද එය PHP හි සාදන ලද XPath සහ XSLTProcessor පන්ති සමඟ ක්‍රියා කරයි.
කෝර්නෙල්

8
සැබවින්ම අඹරන ලද HTML සඳහා, ඔබට එය සැමවිටම DOM වෙත භාර දීමට පෙර htmltidy හරහා ධාවනය කළ හැකිය. මට HTML වෙතින් දත්ත සීරීමට අවශ්‍ය සෑම විටම මම භාවිතා කරන්නේ DOM, හෝ අවම වශයෙන් simplexml ය.
ෆ්‍රෑන්ක් ෆාමර්

9
විකෘති කළ HTML i පැටවීම සමඟ ඇති තවත් දෙයක් නම්, විග්‍රහ කිරීම නවත්වන අනතුරු ඇඟවීම් වලක්වා ගැනීම සඳහා libxml_use_internal_errors (true) අමතන්න.
හස්කි

6
කිසිදු ගැටළුවක් නොමැතිව HTML ප්‍රභව 1000 ක් (විවිධ අක්ෂර වලින් සංකේතවත් කර ඇති විවිධ භාෂාවලින්) විග්‍රහ කිරීමට මම DOMDocument භාවිතා කර ඇත්තෙමි. ඔබට මේ සමඟ කේතීකරණ ගැටළු ඇති විය හැකි නමුත් ඒවා ජයගත නොහැක. ඔබ කරුණු 3 ක් දැන සිටිය යුතුය: 1) පැටවුම් එච්ටීඑම්එල් විසින් කේතන ක්‍රමය තීරණය කිරීම සඳහා මෙටා ටැග්ගේ අක්ෂර කට්ටලය භාවිතා කරයි 2) # 2 HTML අන්තර්ගතයට මෙම තොරතුරු ඇතුළත් නොවන්නේ නම් වැරදි කේතීකරණ හඳුනා ගැනීමකට තුඩු දිය හැකිය 3) නරක යූටීඑෆ් -8 අක්ෂරවලට විග්‍රහකය හරහා ගමන් කළ හැකිය. එවැනි අවස්ථාවන්හිදී, mb_detect_encoding () සහ සිම්පල්පී ආර්එස්එස් පාර්සර්ගේ කේතීකරණ / පරිවර්තන / ඉවත් කිරීම නරක යූටීඑෆ් -8 අක්ෂර කේතය වැඩකරන සඳහා භාවිතා කරන්න.
ශුන්‍ය

1
DOM ඇත්ත වශයෙන්ම XPath සඳහා සහය දක්වයි, DOMXPath දෙස බලන්න .
රයන් මැකේ

147

ඔබ කළ යුත්තේ ඇයි ද සහ ඔබ කළ යුතු සාමාන්ය ප්රකාශනයක භාවිතා?

පළමුවෙන්ම, පොදු වැරදි නාමයක්: Regexps යනු HTML " විග්‍රහ කිරීම " සඳහා නොවේ . කෙසේ වෙතත් Regexes හට දත්ත " උපුටා ගැනීම " කළ හැකිය. නිස්සාරණය යනු ඔවුන් විසින් සාදන ලද දෙයකි. නිසි එස්ජීඑම්එල් මෙවලම් කට්ටල හෝ බේස්ලයින් එක්ස්එම්එල් පාර්සර් වලට වඩා රීජෙක්ස් HTML නිස්සාරණයේ ඇති ප්‍රධානම අඩුපාඩුව නම් ඒවායේ සින්ටැක්ටික් උත්සාහය සහ වෙනස් විශ්වසනීයත්වයයි.

තරමක් විශ්වාස කළ හැකි HTML නිස්සාරණ රීජෙක්ස් සෑදීම සලකා බලන්න:

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

සරල phpQuery හෝ QueryPath ට සමාන කියවිය හැකි ආකාරයක් අඩු ය:

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

කෙසේ වෙතත් ඔවුන්ට උපකාර කළ හැකි විශේෂිත භාවිත අවස්ථා තිබේ.

  • බොහෝ DOM ට්‍රැවර්සල් ෆ්‍රොන්ටෙන්ඩ්ස් HTML අදහස් හෙළි නොකරයි <!--, කෙසේ වෙතත් සමහර විට නිස්සාරණය සඳහා වඩාත් ප්‍රයෝජනවත් නැංගුරම් වේ. විශේෂයෙන් ව්‍යාජ HTML විචල්‍යයන් <$var>හෝ SGML අපද්‍රව්‍ය රීජෙක්ස් සමඟ හීලෑ කිරීම පහසුය.
  • බොහෝ විට නිත්‍ය ප්‍රකාශන මඟින් පශ්චාත් සැකසුම් සුරැකිය හැක. කෙසේ වෙතත්, HTML ආයතන බොහෝ විට අතින් භාර ගැනීම අවශ්‍ය වේ.
  • අවසාන වශයෙන්, <img src = url උපුටා ගැනීම වැනි ඉතා සරල කාර්යයන් සඳහා , ඒවා ඇත්ත වශයෙන්ම සම්භාව්‍ය මෙවලමකි. එස්ජීඑම්එල් / එක්ස්එම්එල් පාර්සර් වලට වඩා වේග වාසිය බොහෝ විට පැමිණෙන්නේ මෙම මූලික නිස්සාරණ ක්‍රියා පටිපාටි සඳහා ය.

සාමාන්‍ය ප්‍රකාශන භාවිතයෙන් HTML ස්නිපටයක් පූර්ව නිස්සාරණය කර /<!--CONTENT-->(.+?)<!--END-->/ඉතිරි කොටස සරල HTML parser frontends භාවිතයෙන් සැකසීම සමහර විට සුදුසුය.

සටහන: ඇත්ත වශයෙන්ම මා සතුව මෙම යෙදුම ඇත , එහිදී මම විකල්ප වශයෙන් XML විග්‍රහ කිරීම සහ සාමාන්‍ය ප්‍රකාශන භාවිතා කරමි. පසුගිය සතියේ PyQuery විග්‍රහ කිරීම කැඩී ගිය අතර රීජෙක්ස් තවමත් ක්‍රියාත්මක විය. ඔව් අමුතුයි, මට එය තනිවම පැහැදිලි කළ නොහැක. නමුත් එය සිදු විය.
එබැවින් කරුණාකර සැබෑ ලෝකයේ සලකා බැලීම්වලට ඡන්දය නොදෙන්න, එය regex = නපුරු මතකයට නොගැලපේ. නමුත් අපි මෙය ඕනෑවට වඩා ඡන්දය නොදෙමු. එය මෙම මාතෘකාව සඳහා පැත්තක් පමණි.


20
DOMCommentඅදහස් කියවිය හැකි බැවින් ඒ සඳහා රීජෙක්ස් භාවිතා කිරීමට හේතුවක් නැත.
ගෝර්ඩන්

4
සැබෑ ලෝකයේ HTML විග්‍රහ කිරීම සඳහා SGML මෙවලම් කට්ටල හෝ XML පාර්සර් සුදුසු නොවේ. ඒ සඳහා සුදුසු වන්නේ විශේෂිත HTML විග්‍රහකයක් පමණි.
ඇලෝසි

12
@Alohci DOMභාවිතා libxml හා libxml වෙනම HTML ව්යාකරණ විග්රහ කර ඇති විට පැටවීම HTML භාවිතා කරනු ඇත මොඩියුලය loadHTML()ඒ නිසා ඉතා බර "සැබෑ ලෝකය" (බිඳ කියවීමට) HTML පුළුවන්.
ගෝර්ඩන්

6
හොඳයි, ඔබේ “සැබෑ ලෝක සලකා බැලීම” පිළිබඳ ස්ථාවරය ගැන අදහස් දක්වන්න. HTML විග්‍රහ කිරීමේදී රෙජෙක්ස් සඳහා ප්‍රයෝජනවත් අවස්ථා ඇති බව සහතිකයි. GOTO භාවිතා කිරීම සඳහා ප්‍රයෝජනවත් අවස්ථාවන් ද ඇත. විචල්ය විචල්යයන් සඳහා ප්රයෝජනවත් අවස්ථා තිබේ. එබැවින් විශේෂිත ක්‍රියාත්මක කිරීමක් නිශ්චිතවම එය භාවිතා කිරීම සඳහා කේත-කුණුවීම සිදු නොවේ. නමුත් එය ඉතා දැඩි අනතුරු ඇඟවීමේ ලකුණකි. සාමාන්‍ය සංවර්ධකයා වෙනස පැවසීමට තරම් සූක්ෂ්ම ලෙස හැසිරෙන්නේ නැත. එබැවින් සාමාන්‍ය රීතියක් ලෙස, Regex GOTO සහ Variable-Variables සියල්ලම නපුරු ය. නපුරු නොවන භාවිතයන් ඇත, නමුත් ඒවා ව්‍යතිරේක වේ (සහ එය දුර්ලභ ය) ... (IMHO)
ircmaxell

11
@mario: ඇත්තටම, HTML හැකි 'නිසි' regexes භාවිතා, සාමාන්යයෙන් එය සාධාරණ රැකියාව අයිපෑඩ් කරන්න ඔවුන් කිහිපයක් ගත වෙනවා නමුත් කියවූ කළ යුතුය. එය සාමාන්‍ය නඩුවේ රාජකීය වේදනාවක් පමණි. මනාව නිර්වචනය කළ ආදානය සහිත විශේෂිත අවස්ථාවන්හිදී, එය සුළුපටු වේ. මිනිසුන් රීජෙක්ස් භාවිතා කළ යුතු අවස්ථා එයයි. සාමාන්‍ය පරණ කුසගින්නෙන් පෙළෙන විශාල පාර්සර් යනු සාමාන්‍ය අවස්ථා සඳහා ඔබට අවශ්‍ය දෙයයි, නමුත් එම රේඛාව අඳින්නේ කොතැනද යන්න අනියම් පරිශීලකයාට සෑම විටම පැහැදිලි නැත. කුමන කේතය සරල හා පහසු වුවත්, ජය ගනී.
tchrist

131

චතුර ලෙස jQuery API ප්‍රතිවර්තනය කිරීමේදී phpQuery සහ QueryPath අතිශයින්ම සමාන ය. PHP හි HTML නිසි ලෙස විග්‍රහ කිරීමට පහසුම ප්‍රවේශයන් දෙකක් වන්නේ එබැවිනි .

QueryPath සඳහා උදාහරණ

මූලික වශයෙන් ඔබ පළමුව HTML නූලකින් විමසිය හැකි DOM ගසක් සාදයි:

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

එහි ප්‍රති ing ලයක් ලෙස HTML ලේඛනයේ සම්පූර්ණ ගස් නිරූපණය අඩංගු වේ. DOM ක්‍රම භාවිතයෙන් එය ගමන් කළ හැකිය. නමුත් පොදු ප්‍රවේශය වන්නේ jQuery හි වැනි CSS තේරීම් භාවිතා කිරීමයි:

 $qp->find("div.classname")->children()->...;

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

බොහෝ දුරට ඔබ සරල භාවිතා කිරීමට අවශ්ය #idහා .classහෝ DIVසඳහා ටැගය තේරීම් ->find(). නමුත් ඔබට XPath ප්‍රකාශ භාවිතා කළ හැකිය , සමහර විට එය වේගවත් වේ. සාමාන්‍ය HTML ස්නිපෙට් නිස්සාරණය කිරීම වැනි ->children()සහ ->text()විශේෂයෙන් ->attr()සරල කරන jQuery ක්‍රම . (දැනටමත් ඔවුන්ගේ SGML ආයතන විකේතනය කර ඇත.)

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

QueryPath ද නව ටැගයන් ධාරාවට ඇතුල් කිරීමට ඉඩ දෙයි ( ->append), පසුව ප්‍රතිදානය සහ යාවත්කාලීන කළ ලේඛනයක් ( ->writeHTML) පෙර නිමිත්තක් කිරීමට . එය විකෘති කළ HTML විග්‍රහ කිරීමට පමණක් නොව, විවිධ XML උපභාෂා (නාම අවකාශයන් සහිතව) විග්‍රහ කළ හැකි අතර HTML මයික්‍රොෆෝමැට් (XFN, vCard) වෙතින් දත්ත උකහා ගැනීමටද හැකිය.

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

.

phpQuery හෝ QueryPath?

සාමාන්‍යයෙන් QueryPath ලේඛන හැසිරවීමට වඩා සුදුසුය. PhpQuery විසින් jQuery වලට වඩා සමීපව සමාන වන පරිදි සමහර ව්‍යාජ AJAX ක්‍රම (HTTP ඉල්ලීම් පමණක්) ක්‍රියාත්මක කරයි. බොහෝ විට phpQuery QueryPath ට වඩා වේගවත් බව කියනු ලැබේ (සමස්ත ලක්ෂණ අඩු නිසා).

වෙනස්කම් පිළිබඳ වැඩි විස්තර සඳහා tagbyte.org වෙතින් මාර්ගගත කිරීමේ යන්ත්‍රය සමඟ මෙම සංසන්දනය බලන්න . (මුල් මූලාශ්‍රය අතුරුදහන් වී ඇත, එබැවින් මෙන්න අන්තර්ජාල ලේඛනාගාර සබැඳියක්. ඔව්, ඔබට තවමත් නැතිවූ පිටු සොයාගත හැකිය, මිනිසුන්.)

මෙන්න සවිස්තරාත්මක QueryPath හැඳින්වීමක් .

වාසි

  • සරල බව සහ විශ්වසනීයත්වය
  • විකල්ප භාවිතා කිරීමට සරලයි ->find("a img, a object, div a")
  • නිසි දත්ත ඉවත් කිරීම (සාමාන්‍ය ප්‍රකාශන ග්‍රහණයට සාපේක්ෂව)

88

සරල HTML DOM යනු විශිෂ්ට විවෘත කේත විග්‍රහයකි:

simplehtmldom.sourceforge

එය DOM මූලද්‍රව්‍යයන්ට වස්තු-නැඹුරු ආකාරයකින් සලකන අතර, නව ක්‍රියාකාරීත්වයට අනුකූල නොවන කේත සඳහා විශාල ආවරණයක් ඇත. ඔබ ජාවාස්ක්‍රිප්ට් හි දැකිය හැකි “සොයාගන්න” ශ්‍රිතය වැනි විශිෂ්ට කාර්යයන් කිහිපයක් ඇත, එමඟින් එම ටැග් නාමයේ සියලුම අංග නැවත ලබා දෙනු ඇත.

මම මෙය මෙවලම් ගණනාවක භාවිතා කර ඇති අතර එය විවිධ වර්ගයේ වෙබ් පිටු වල පරීක්ෂා කර ඇති අතර එය විශිෂ්ට ලෙස ක්‍රියා කරයි.


61

මා මෙහි සඳහන් කර නැති එක් පොදු ප්‍රවේශයක් වන්නේ ටයිඩි හරහා HTML ධාවනය කිරීමයි , එය සහතික කළ හැකි වලංගු XHTML පිට කිරීමට කෙළින් හැකිය. එවිට ඔබට එය මත ඕනෑම පැරණි XML පුස්තකාලයක් භාවිතා කළ හැකිය.

නමුත් ඔබේ විශේෂිත ගැටළුවට, ඔබ මෙම ව්‍යාපෘතිය දෙස බැලිය යුතුය: http://fivefilters.org/content-only/ - එය කියවීමේ හැකියාව ඇල්ගොරිතමයේ නවීකරණය කරන ලද අනුවාදයකි , එය නිර්මාණය කර ඇත්තේ පෙළ අන්තර්ගතය උකහා ගැනීම සඳහාය (ශීර්ෂයන් නොවේ සහ පාදක) පිටුවකින්.


56

1a සහ 2 සඳහා: මම නව Symfony Componet පන්තියේ DOMCrawler ( DomCrawler ) සඳහා ඡන්දය දෙමි . මෙම පන්තිය CSS තේරීම් වලට සමාන විමසුම් වලට ඉඩ දෙයි. සැබෑ ලෝක උදාහරණ සඳහා මෙම ඉදිරිපත් කිරීම දෙස බලන්න: ප්‍රවෘත්ති-ඔෆ්-සිම්ෆෝනි 2-වර්ල්ඩ් .

සං component ටකය තනිවම වැඩ කිරීම සඳහා නිර්මාණය කර ඇති අතර එය සිම්ෆනි නොමැතිව භාවිතා කළ හැකිය.

එකම පසුබෑම වන්නේ එය ක්‍රියාත්මක වන්නේ PHP 5.3 හෝ නවතම ඒවා සමඟ පමණි.


jquery වැනි css විමසුම් හොඳින් කියනු ලැබේ, මන්ද w3c ප්‍රලේඛනයේ සමහර දේවල් නැති නමුත් jquery හි අමතර අංග ලෙස ඒවා දක්නට ලැබේ.
නිකොලා පෙට්කාන්ස්කි

53

මෙය සාමාන්‍යයෙන් තිර සීරීම ලෙස හැඳින්වේ . මේ සඳහා මා භාවිතා කර ඇති පුස්තකාලය සරල HTML ඩොම් පාර්සර් ය .


8
තදින්ම සත්‍ය නොවේ ( en.wikipedia.org/wiki/Screen_scraping#Screen_scraping ). හෝඩුවාව "තිරයේ" ඇත; විස්තර කර ඇති නඩුවේ, තිරයක් සම්බන්ධ නොවේ. පිළිගත හැකි වුවත්, මෙම යෙදුම මෑතදී අනිසි ලෙස භාවිතා කර ඇත.
බොබී ජැක්

4
මම තිර සීරීම නොවේ, විග්‍රහ කරනු ලබන අන්තර්ගතය මගේ ගිවිසුම යටතේ අන්තර්ගත සැපයුම්කරු විසින් අවසර දෙනු ලැබේ.
රොබට් පිට්

41

අපි මීට පෙර අපගේ අවශ්‍යතා සඳහා බඩගා යන ස්වල්පයක් නිර්මාණය කර ඇත්තෙමු. දවස අවසානයේදී, එය සාමාන්‍යයෙන් සරල නිත්‍ය ප්‍රකාශන වේ. ඉහත ලැයිස්තුගත කර ඇති පුස්තකාල ඒවා නිර්මාණය කිරීමට හේතුව හොඳ වුවත්, ඔබ සොයන දේ ඔබ දන්නේ නම්, නිත්‍ය ප්‍රකාශන යනු ආරක්ෂිත මාර්ගයකි, මන්ද ඔබට වලංගු නොවන HTML / XHTML ව්‍යුහයන් ද හැසිරවිය හැකි අතර ඒවා පටවනු ලැබේ නම් අසාර්ථක වනු ඇත. බොහෝ පාර්සර් හරහා.



36

මෙය W3C XPath තාක්ෂණය පිළිබඳ හොඳ කාර්ය විස්තරයක් සේ පෙනේ. "කූඩුවල ඇති සියලුම hrefගුණාංග imgටැග් වල ආපසු එවන්න" වැනි විමසුම් ප්‍රකාශ කිරීම පහසුය <foo><bar><baz> elements. PHP බෆරයක් නොවීම, XPath ලබා ගත හැකි ස්වරූපයෙන් මට ඔබට පැවසිය නොහැක. HTML ගොනුව සැකසීමට ඔබට බාහිර වැඩසටහනක් ඇමතිය හැකි නම්, ඔබට XPath හි විධාන රේඛා අනුවාදයක් භාවිතා කළ හැකිය. ඉක්මන් හැඳින්වීමක් සඳහා, http://en.wikipedia.org/wiki/XPath බලන්න .


29

String Parsing වෙනුවට DOM භාවිතා කරන SimpleHtmlDom සඳහා තෙවන පාර්ශවීය විකල්ප: phpQuery , Zend_Dom , QueryPath සහ FluentDom .


3
ඔබ දැනටමත් මගේ අදහස් පිටපත් කර ඇත්නම්, අවම වශයෙන් ඒවා නිසි ලෙස සම්බන්ධ කරන්න;) එය විය යුත්තේ: String Parsing වෙනුවට DOM භාවිතා කරන SimpleHtmlDom වෙත තෙවන පාර්ශවීය විකල්පයන් යෝජනා කිරීම: phpQuery , Zend_Dom , QueryPath සහ FluentDom .
ගෝර්ඩන්

1
හොඳ පිළිතුරු හොඳ මූලාශ්‍රයකි. stackoverflow.com/questions/3606792/…
danidacar

24

ඔව්, ඔබට මේ සඳහා simple_html_dom භාවිතා කළ හැකිය. කෙසේ වෙතත්, මම සරල_එච්එම්එල්_ඩොම් සමඟ බොහෝ සෙයින් වැඩ කර ඇත්තෙමි, විශේෂයෙන් වෙබ් සීරීම් සඳහා සහ එය අනාරක්ෂිත බව සොයාගෙන ඇත. එය මූලික කාර්යය කරන නමුත් මම එය කෙසේ හෝ නිර්දේශ නොකරමි.

මම කිසි විටෙකත් කර්ල් භාවිතා කර නැත, නමුත් මම ඉගෙන ගත් දෙය නම් කර්ල්ට එම කාර්යය වඩාත් කාර්යක්ෂමව කළ හැකි අතර එය වඩාත් .න ය.

කරුණාකර මෙම සබැඳිය පරීක්ෂා කරන්න: සීරීම්-වෙබ් අඩවි-වක්‍රය සමඟ


2
curl හට ගොනුව ලබා ගත හැක, නමුත් එය ඔබ වෙනුවෙන් HTML විග්‍රහ නොකරයි. ඒක අමාරු කොටස.
cHao

23

QueryPath හොඳයි, නමුත් එහි තේරුම ඔබ නොදැන සිටියේ නම් "තත්වය සොයා ගැනීම" ගැන සැලකිලිමත් වන්න, එයින් අදහස් කරන්නේ ඔබ සිදු වූ දේ සහ කේතය ක්‍රියා නොකරන්නේ මන්දැයි සොයා ගැනීමට බොහෝ නිදොස් කිරීමේ කාලය නාස්ති කිරීමයි.

එහි තේරුම නම්, ප්‍රති result ල කට්ටලයේ සෑම ඇමතුමක්ම වස්තුවෙහි ප්‍රති set ල කට්ටලය වෙනස් කරයි, එය එක් එක් සබැඳිය නව කට්ටලයක් වන jquery හි මෙන් දම්වැල් කළ නොහැකි ය, ඔබට තනි කට්ටලයක් ඇති අතර එය ඔබේ විමසුමේ ප්‍රති results ල වන අතර එක් එක් ක්‍රියාකාරී ඇමතුම වෙනස් වේ ඒ තනි කට්ටලය.

Jquery වැනි හැසිරීම ලබා ගැනීම සඳහා, ඔබ පෙරනයක් / මෙහෙයුමක් වැනි වෙනස් කිරීමට පෙර අතු බෙදිය යුතුය, එයින් අදහස් කරන්නේ එය jquery හි සිදුවන දේ වඩාත් සමීපව පිළිබිඹු කරන බවයි.

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$resultsinput[name='forename']මුල් විමසුම සඳහා ප්‍රති set ල කට්ටලය දැන් අඩංගු වන අතර, "div p"මෙය මට බොහෝ සෙයින් ඉවහල් විය, මම සොයාගත් දෙය නම්, QueryPath විසින් පෙරහන් සහ සොයාගැනීම් සහ ඔබේ ප්‍රති results ල වෙනස් කරන සහ ඒවා වස්තුව තුළ ගබඩා කරන සියල්ල නිරීක්ෂණය කරයි. ඒ වෙනුවට ඔබ මෙය කළ යුතුයි

$forename = $results->branch()->find("input[name='forname']")

එවිට $resultsවෙනස් නොවනු ඇති අතර ඔබට නැවත නැවත සැකසූ ප්‍රති result ලය නැවත භාවිතා කළ හැකිය, සමහර විට වැඩි දැනුමක් ඇති කෙනෙකුට මෙය මඳක් ඉවත් කළ හැකිය, නමුත් එය මූලික වශයෙන් මා සොයාගත් දෙයින් මේ හා සමාන වේ.


20

උසස් Html Dom යනු එකම අතුරු මුහුණතක් ලබා දෙන සරල HTML DOM ආදේශනයකි , නමුත් එය DOM මත පදනම් වූ අතර එයින් අදහස් වන්නේ සම්බන්ධිත මතක ගැටළු කිසිවක් සිදු නොවන බවයි.

එයට jQuery දිගු ඇතුළුව පූර්ණ CSS සහාය ඇත.


උසස් HTML ඩොම් වෙතින් මට හොඳ ප්‍රති results ල ලැබී ඇති අතර, එය පිළිගත් පිළිතුරේ ලැයිස්තුවේ තිබිය යුතු යැයි මම සිතමි. "මෙම ව්‍යාපෘතියේ පරමාර්ථය වන්නේ PHP හි සරල html dom පුස්තකාලය සඳහා DOM මත පදනම් වූ ඩ්‍රොප්-ඉන් ආදේශකයක් වීමයි ... ඔබ ගොනුව / str_get_html භාවිතා කරන්නේ නම් ඔබට අවශ්‍ය නොවේ ඕනෑම දෙයක් වෙනස් කරන්න. ” archive.is/QtSuj#selection-933.34-933.100 යනු සමහර නොගැලපීම් වලට සරිලන සේ ඔබේ කේතයේ වෙනස්කම් කිරීමට ඔබට අවශ්‍ය විය හැකිය. ව්‍යාපෘතියේ ගිතබ් ගැටළු වලදී මා දන්නා හතරක් සටහන් කර ඇත්තෙමි. github.com/monkeysuffrage/advanced_html_dom/issues
ChrisJJ

වැඩ කළා! ස්තූතියි
ෆයිසාල් ශානි

18

සඳහා HTML5 , HTML5 lib දැන් වසර සඳහා නවතා දමා ඇති බවත් වාර්තා වේ. මෑත කාලීන යාවත්කාලීන කිරීම් සහ නඩත්තු වාර්තා සමඟ මට සොයාගත හැකි එකම HTML5 පුස්තකාලය වන්නේ සතියකට පෙර බීටා 1.0 වෙත ගෙන එන ලද html5-php ය.


17

GB ලිපිගොනු පහසුවෙන් හැසිරවිය හැකි පොදු අරමුණු XML විග්‍රහයක් මා ලියා ඇත. එය XMLReader මත පදනම් වී ඇති අතර එය භාවිතා කිරීම ඉතා පහසු ය:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

මෙන්න github repo: XmlExtractor


17

මම PHPPowertools / DOM-Query නමින් පුස්තකාලයක් නිර්මාණය කළෙමි , එමඟින් ඔබට jQuery සමඟ කරන ආකාරයටම HTML5 සහ XML ලේඛන බඩගා ගැනීමට ඉඩ සලසයි.

ඒ අවටනම් යටතේ, එය භාවිතා කරයි symfony / DomCrawler කිරීමට CSS තේරීම් පරිවර්තනය කිරීම සඳහා XPath තේරීම්. යහපත් කාර්ය සාධනයක් සහතික කිරීම සඳහා එය සෑම විටම එකම වස්තුවක් තවත් වස්තුවකට යවන විට එකම ඩොම් ලේඛනය භාවිතා කරයි.


උදාහරණ භාවිතය:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

සහාය දක්වන ක්‍රම:


  1. පැහැදිලි හේතු නිසා 'තෝරන්න' ලෙස නම් කරන ලදි
  2. 'හිස්' යනු PHP හි වෙන් කර ඇති වචනයක් බැවින් 'අවලංගු' ලෙස නැවත නම් කරන්න

සටහන :

PSR-0 අනුකූල පුස්තකාල සඳහා තමන්ගේම ශුන්‍ය වින්‍යාස ස්වයංක්‍රීය යන්ත්‍රයක් පුස්තකාලයට ඇතුළත් වේ. ඇතුළත් කර ඇති උදාහරණය අමතර වින්‍යාසයකින් තොරව කොටුවෙන් පිටත ක්‍රියා කළ යුතුය. විකල්පයක් ලෙස, ඔබට එය රචනා සමඟ භාවිතා කළ හැකිය.


කාර්යය සඳහා නිවැරදි මෙවලමක් සේ පෙනේ, නමුත් වර්ප්‍රෙස් හි PHP 5.6.23 හි මා සඳහා පටවන්නේ නැත. එය නිවැරදිව ඇතුළත් කරන්නේ කෙසේද යන්න පිළිබඳ අමතර උපදෙස් තිබේද? එය ඇතුළත් කර ඇත්තේ: නිර්වචනය කරන්න ("BASE_PATH", ඩිරෙනේම් ( FILE )); නිර්වචනය කරන්න ("LIBRARY_PATH", BASE_PATH. DIRECTORY_SEPARATOR. 'lib / වෙළෙන්දා'); LIBRARY_PATH අවශ්‍යයි. DIRECTORY_SEPARATOR. 'Loader.php'; පැටවුම :: init (අරාව (LIBRARY_PATH, USER_PATH)); in functions.php
lithiumlab

15

ඕනෑම "බිඳුණු" HTML එකක් පිරිසිදු කර HTML XHTML බවට පරිවර්තනය කිරීම සඳහා ඔබට HTML Tidy වැනි දෙයක් භාවිතා කිරීමට උත්සාහ කළ හැකිය, එවිට ඔබට XML විග්‍රහකයක් සමඟ විග්‍රහ කළ හැකිය.


15

ඔබට උත්සාහ කළ හැකි තවත් විකල්පයක් වන්නේ QueryPath ය . එය දේවානුභාවයෙන් jQuery, නමුත් PHP හි සේවාදායකයේ සහ Drupal හි භාවිතා වේ .


12

XML_HTMLSaxතරමක් ස්ථායී - එය තවදුරටත් නඩත්තු නොකළද. තවත් විකල්පයක් වනුයේ ඔබට HTML ටයිඩි හරහා HTML නල මාර්ගගත කර සම්මත XML මෙවලම් සමඟ විග්‍රහ කිරීමයි.



11

HTML / XML DOM සැකසීමට බොහෝ ක්‍රම තිබේ, ඒවායින් බොහොමයක් දැනටමත් සඳහන් කර ඇත. ඒ නිසා, මම ඒවා ලැයිස්තුගත කිරීමට කිසිදු උත්සාහයක් නොගනිමි.

මට අවශ්‍ය වන්නේ මා පෞද්ගලිකව DOM දිගුව භාවිතා කිරීමට කැමැත්තක් දක්වන අතර එයට හේතුව:

  • iit යටින් පවතින C කේතයේ කාර්යසාධන වාසිය ප්‍රශස්ත ලෙස භාවිතා කරයි
  • එය OO PHP (සහ එය උපවර්ග කිරීමට මට ඉඩ දෙයි)
  • එය තරමක් පහත් මට්ටමක පවතී (එය වඩාත් දියුණු හැසිරීම් සඳහා පුපුරා නොයන පදනමක් ලෙස භාවිතා කිරීමට මට ඉඩ සලසයි)
  • එය DOM හි සෑම කොටසකටම ප්‍රවේශය සපයයි (උදා: SimpleXml මෙන් නොව, එතරම් නොදන්නා XML විශේෂාංග නොසලකා හරියි)
  • එය ස්වදේශික ජාවාස්ක්‍රිප්ට් හි භාවිතා කරන සින්ටැක්ස් වලට සමාන DOM බඩගා යාම සඳහා භාවිතා කරන සින්ටැක්ස් ඇත.

CSS තේරීම් සඳහා භාවිතා කිරීමේ හැකියාව මට මග DOMDocumentහැරී ඇති අතර, මෙම අංගය එක් කිරීමට තරමක් සරල හා පහසු ක්‍රමයක් ඇත: උප කාණ්ඩය DOMDocumentසහ JS වැනි ක්‍රම querySelectorAllසහ querySelectorඔබේ උප පංතියට ක්‍රම එකතු කිරීම .

තේරීම් මාණකරනය ක්රියාත්මක කිරීම සඳහා, මම ඉතා minimalistic භාවිතා කිරීම නිර්දේශ CssSelector අංගයක් සිට Symfony රාමුව . මෙම සං component ටකය CSS තේරීම් කාර්‍යයන් එක්ස්පාත් තේරීම් කරුවන්ට පරිවර්ථනය කරයි, පසුව එය aDOMXpath සං component ටකය කරන්නන් එක්ස්පාත් තේරීම් කරුවන්ට පරිවර්ථනය කරයි, එමඟින් අනුරූප නෝඩලිස්ට් ලබා ගැනීම සඳහා .

ඔබට මෙම (තවමත් ඉතා පහත් මට්ටමේ) උප පංතිය භාවිතා කිරීමට හැකිය. විශේෂිත XML වර්ග විග්‍රහ කරන්න හෝ jQuery වැනි හැසිරීම් එකතු කරන්න.

පහත කේතය මගේ DOM- විමසුම් පුස්තකාලයෙන් කෙළින්ම පැමිණ මා විස්තර කළ තාක්ෂණය භාවිතා කරයි.

HTML විග්‍රහ කිරීම සඳහා:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

සිම්ෆෝනි සඳහා CssSelector සංරචකය නිර්මාණය කිරීමට ගත් තීරණය සහ එය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳව සිම්ෆෝනි හි නිර්මාතෘ ෆේබියන් පොටෙන්සියර් විසින් CSS තේරීම්කරුවන් සමඟ XML ලේඛන විග්‍රහ කිරීම ද බලන්න .


9

FluidXML සමඟ ඔබට XPath සහ CSS තේරීම් භාවිතා කරමින් XML විමසීමට සහ නැවත සැකසීමට හැකිය .

$doc = fluidxml('<html>...</html>');

$title = $doc->query('//head/title')[0]->nodeValue;

$doc->query('//body/p', 'div.active', '#bgId')
        ->each(function($i, $node) {
            // $node is a DOMNode.
            $tag   = $node->nodeName;
            $text  = $node->nodeValue;
            $class = $node->getAttribute('class');
        });

https://github.com/servo-php/fluidxml



7

නිත්‍ය ප්‍රකාශනයෙන් HTML විග්‍රහ නොකිරීමට හේතු කිහිපයක් තිබේ. එහෙත්, HTML ජනනය කරන්නේ කුමක් ද යන්න පිළිබඳ පූර්ණ පාලනයක් ඔබට තිබේ නම්, ඔබට සරල නිත්‍ය ප්‍රකාශනයකින් කළ හැකිය.

ඉහළින් එය සාමාන්‍ය ප්‍රකාශනයකින් HTML විග්‍රහ කරන ශ්‍රිතයකි. මෙම ශ්‍රිතය ඉතා සංවේදී වන අතර HTML විසින් යම් නීතිරීතිවලට අවනත විය යුතු බව ඉල්ලා සිටින නමුත් එය බොහෝ අවස්ථාවන්හිදී ඉතා හොඳින් ක්‍රියාත්මක වේ. ඔබට සරල විග්‍රහයක් අවශ්‍ය නම් සහ පුස්තකාල ස්ථාපනය කිරීමට අවශ්‍ය නැතිනම්, මෙය ලබා දෙන්න:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));

2

මම නොමිලයේ ලබා ගත හැකි HTML5DOMDocument නමින් පුස්තකාලයක් නිර්මාණය කර ඇත්තෙමි https://github.com/ivopetkov/html5-dom-document-php

එය ඔබේ නඩුවේ අතිශයින්ම ප්‍රයෝජනවත් වනු ඇතැයි මා සිතන විමසුම් තේරීම්කරුවන්ට ද සහාය වේ. මෙන්න උදාහරණ කේතය:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;

1

Xml විග්‍රහ කිරීම සඳහා හොඳම ක්‍රමය:

$xml='http://www.example.com/rss.xml';
$rss = simplexml_load_string($xml);
$i = 0;
foreach ($rss->channel->item as $feedItem) {
  $i++;
  echo $title=$feedItem->title;
  echo '<br>';
  echo $link=$feedItem->link;
  echo '<br>';
  if($feedItem->description !='') {
    $des=$feedItem->description;
  } else {
    $des='';
  }
  echo $des;
  echo '<br>';
  if($i>5) break;
}

0

ඔබ jQuery තේරීම ගැන හුරුපුරුදු නම්, ඔබට PHP සඳහා ScarletsQuery භාවිතා කළ හැකිය

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

මෙම පුස්තකාලය සාමාන්‍යයෙන් නොබැඳි html සැකසීමට තත්පර 1 කට වඩා අඩු කාලයක් ගතවේ.
එය වලංගු නොවන HTML හෝ ටැග් ගුණාංගවල උපුටා දැක්වීම් ද පිළිගනී.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.