කෙනෙකුට HTML / XML විග්රහ කර එයින් තොරතුරු ලබා ගන්නේ කෙසේද?
කෙනෙකුට HTML / XML විග්රහ කර එයින් තොරතුරු ලබා ගන්නේ කෙසේද?
Answers:
මම කැමතියි ස්වදේශික එක්ස්එම්එල් දිගුවක් PHP සමඟ බැඳී ඇති බැවින් ඒවා සාමාන්යයෙන් තෙවන පාර්ශවීය ලිබ් වලට වඩා වේගවත් වන අතර සලකුණු කිරීම සඳහා මට අවශ්ය සියලු පාලනය ලබා දෙන්න.
DOM දිගුව මඟින් PHP 5 සමඟ DOM API හරහා XML ලේඛන මත ක්රියා කිරීමට ඉඩ ලබා දේ. එය W3C හි ලේඛන වස්තු ආකෘති මූලික මට්ටම 3, වේදිකාවක් සහ භාෂා-උදාසීන අතුරුමුහුණතක් ක්රියාත්මක කිරීමකි. ලේඛනවල අන්තර්ගතය, ව්යුහය සහ ශෛලිය.
ඩොම්ට සැබෑ ලෝකයේ (බිඳුණු) HTML විග්රහ කිරීමට සහ වෙනස් කිරීමට හැකියාවක් ඇති අතර එයට XPath විමසුම් කළ හැකිය . එය libxml මත පදනම් වේ .
DOM සමඟ tive ලදායී වීමට යම් කාලයක් ගත වේ, නමුත් එම කාලය IMO සඳහා එය වටී. DOM යනු භාෂා-අ nost ෙයවාදී අතුරු මුහුණතක් බැවින්, ඔබ බොහෝ භාෂාවලින් ක්රියාත්මක කිරීම් සොයා ගනු ඇත, එබැවින් ඔබට ඔබේ ක්රමලේඛන භාෂාව වෙනස් කිරීමට අවශ්ය නම්, එම භාෂාවේ DOM API භාවිතා කරන්නේ කෙසේදැයි ඔබ දැනටමත් දැන ගනු ඇත.
මූලද්රව්යයක href ගුණාංගය උදුරා ගැනීමේදී මූලික භාවිත උදාහරණයක් සොයාගත හැකි අතර සාමාන්ය සංකල්පීය දළ විශ්ලේෂණයක් php හි DOMDocument වෙතින් සොයාගත හැකිය.
DOM දිගුව භාවිතා කරන්නේ කෙසේද යන්න StackOverflow හි පුළුල් ලෙස ආවරණය කර ඇත , එබැවින් ඔබ එය භාවිතා කිරීමට තෝරා ගන්නේ නම්, ඔබ විසින් පැන නගින බොහෝ ගැටලු විසඳා ගත හැකි බව ඔබට සහතික විය හැකිය.
XMLReader දිගුව යනු XML අදින්න විග්රහයකි. පා er කයා කර්සරයක් ලෙස ක්රියා කරන්නේ ලේඛන ප්රවාහයේ ඉදිරියට යන අතර මඟෙහි සෑම නෝඩයකම නතර වේ.
DOM වැනි XMLReader, libxml මත පදනම් වේ. HTML පාර්සර් මොඩියුලය අවුලුවන්නේ කෙසේදැයි මම නොදනිමි, එබැවින් බිඳුණු HTML විග්රහ කිරීම සඳහා XMLReader භාවිතා කිරීමේ අවස්ථා DOM භාවිතා කිරීමට වඩා ශක්තිමත් විය හැකි අතර එහිදී ඔබට libxml හි HTML Parser මොඩියුලය භාවිතා කිරීමට පැහැදිලිවම පැවසිය හැකිය.
Php භාවිතා කරමින් h1 ටැග් වලින් සියලු අගයන් ලබා ගැනීමේදී මූලික භාවිත උදාහරණයක් සොයාගත හැකිය
මෙම දිගුව මඟින් ඔබට XML විග්රහයන් නිර්මාණය කිරීමට සහ විවිධ XML සිදුවීම් සඳහා හසුරුවන්නන් අර්ථ දැක්වීමට ඉඩ දෙයි. සෑම එක්ස්එම්එල් විග්රහයකම ඔබට සකස් කළ හැකි පරාමිති කිහිපයක් ද ඇත.
එක්ස්එම්එල් පාර්සර් පුස්තකාලය ද ලිබෙක්ස්එම්එල් මත පදනම් වී ඇති අතර SAX විලාසිතාවේ එක්ස්එම්එල් තල්ලු විග්රහකය ක්රියාත්මක කරයි. එය DOM හෝ SimpleXML වලට වඩා මතක කළමනාකරණය සඳහා වඩා හොඳ තේරීමක් විය හැකි නමුත් XMLReader විසින් ක්රියාත්මක කරන ලද අදින්න විග්රහයට වඩා වැඩ කිරීමට අපහසු වනු ඇත.
සාමාන්ය දේපල තේරීම් කරුවන් හා අරා ඉරේටරයන් සමඟ සැකසිය හැකි වස්තුවක් බවට XML පරිවර්තනය කිරීම සඳහා සරල XML දිගුව ඉතා සරල හා පහසුවෙන් භාවිතා කළ හැකි මෙවලම් කට්ටලයක් සපයයි.
සරල XML යනු HTML වලංගු XHTML බව ඔබ දන්නා විට විකල්පයකි. ඔබට බිඳුණු HTML විග්රහ කිරීමට අවශ්ය නම්, SimpleXml පවා නොසලකන්න.
මූලික භාවිතය උදාහරණයක් සොයා ගත හැක xml ගොනුව කාර්යයන් කැ ගැනීම සඳහා CRUD node එකක් මතම ඊට අදාල සහ node එකක් මතම ඊට අදාල අගයන් සරල වැඩසටහන හා පවතින අත්පොත, PHP අතිරේක උදාහරණ ගොඩක් .
ඔබ තෙවන පාර්ශවීය ලිබ් භාවිතා කිරීමට කැමති නම් , නූල් විග්රහ කිරීම වෙනුවට යටින් DOM / libxml භාවිතා කරන lib භාවිතා කිරීමට මම යෝජනා කරමි .
FluentDOM විසින් PHP හි DOMDocument සඳහා jQuery වැනි චතුර XML අතුරු මුහුණතක් සපයයි. තේරීම් කරන්නන් XPath හෝ CSS වලින් ලියා ඇත (CSS සිට XPath පරිවර්තකය භාවිතා කරමින්). වත්මන් අනුවාදයන් සම්මත අතුරුමුහුණත් ක්රියාත්මක කරන DOM දීර් extend කරන අතර DOM ජීවන ප්රමිතියෙන් විශේෂාංග එකතු කරයි. FluentDOM හට JSON, CSV, JsonML, RabbitFish වැනි ආකෘති පූරණය කළ හැකිය. රචනා හරහා ස්ථාපනය කළ හැකිය.
Wa72 \ HtmlPageDom` යනු HTML ලේඛන පහසුවෙන් හැසිරවීම සඳහා වන PHP පුස්තකාලයකි. එයට DOM ගස හරහා ගමන් කිරීම සඳහා Symfony2 සංරචක වලින් DomCrawler අවශ්ය වන අතර HTML ලේඛනවල DOM ගස හැසිරවීමේ ක්රම එකතු කිරීමෙන් එය දිගු කරයි.
phpQuery යනු PHP5 හි ලියා ඇති jQuery ජාවාස්ක්රිප්ට් පුස්තකාලය මත පදනම් වූ සේවාදායක පාර්ශවීය, දාම කළ හැකි, CSS3 තේරීම් මඟින් මෙහෙයවන ලේඛන වස්තු ආකෘතිය (DOM) API වන අතර අතිරේක විධාන රේඛා අතුරුමුහුණත (CLI) සපයයි.
මෙයද බලන්න: https://github.com/electrolinux/phpquery
Zend_Dom DOM ලේඛන සහ ව්යුහයන් සමඟ වැඩ කිරීම සඳහා මෙවලම් සපයයි. දැනට, අපි Xnd_Dom_Query පිරිනමන්නෙමු, එය XPath සහ CSS තේරීම් දෙකම භාවිතා කරමින් DOM ලේඛන විමසීමට ඒකාබද්ධ අතුරු මුහුණතක් සපයයි.
QueryPath යනු XML සහ HTML හැසිරවීම සඳහා වන PHP පුස්තකාලයකි. එය සැලසුම් කර ඇත්තේ දේශීය ලිපිගොනු සමඟ පමණක් නොව, වෙබ් සේවා සහ දත්ත සමුදා සම්පත් සමඟ ද ක්රියා කිරීමට ය. එය jQuery අතුරුමුහුණත (CSS විලාසිතාවේ තේරීම් කාරක ඇතුළුව) බොහෝමයක් ක්රියාත්මක කරයි, නමුත් එය සේවාදායක පාර්ශවීය භාවිතය සඳහා දැඩි ලෙස සුසර කර ඇත. රචනා හරහා ස්ථාපනය කළ හැකිය.
PHP අනතුරු ඇඟවීම් හෝ දැන්වීම් වෙනුවට දෝෂ වල සෑම අවස්ථාවකම ව්යතිරේක භාවිතා කිරීමට fDOMDocument සම්මත DOM දිගු කරයි. ඔවුන් පහසුව සඳහා සහ DOM භාවිතය සරල කිරීම සඳහා විවිධ අභිරුචි ක්රම සහ කෙටිමං එකතු කරයි.
saber / xml යනු සරල "xml to object / array" සිතියම්කරණ පද්ධතියක් සහ සැලසුම් රටාවක් නිර්මාණය කිරීම සඳහා XMLReader සහ XMLWriter පන්ති ඔතා පුළුල් කරන පුස්තකාලයකි. එක්ස්එම්එල් ලිවීම සහ කියවීම තනි පාස් එකක් වන අතර එම නිසා වේගවත් විය හැකි අතර විශාල එක්ස්එම්එල් ලිපිගොනු වල අඩු මතකයක් අවශ්ය වේ.
FluidXML යනු සංක්ෂිප්ත හා චතුර කථික API සමඟ XML හැසිරවීම සඳහා වන PHP පුස්තකාලයකි. එය එක්ස්පාත් සහ චතුර ලෙස ක්රමලේඛන රටාව විනෝදජනක හා .ලදායී බවට පත් කරයි.
DOM / libxml මත ගොඩනැඟීමේ වාසිය නම් ඔබ දේශීය දිගුවක් මත පදනම් වී ඇති නිසා ඔබට හොඳ කාර්ය සාධනයක් ලබා ගත නොහැකි වීමයි. කෙසේ වෙතත්, සියලුම තෙවන පාර්ශවීය ලිබ්ස් මෙම මාර්ගයෙන් බැස නොයයි. ඒවායින් සමහරක් පහත ලැයිස්තු ගත කර ඇත
- PHP5 + හි ලියා ඇති HTML DOM විග්රහකය ඔබට HTML ඉතා පහසුවෙන් හැසිරවීමට ඉඩ දෙයි!
- PHP 5+ අවශ්යයි.
- අවලංගු HTML සඳහා සහය දක්වයි.
- JQuery වැනි තේරීම්කරුවන් සමඟ HTML පිටුවක ටැග් සොයා ගන්න.
- HTML වෙතින් අන්තර්ගතයන් තනි පේළියකින් උපුටා ගන්න.
මම සාමාන්යයෙන් මෙම විග්රහකය නිර්දේශ නොකරමි. කේත රචනය භයානක වන අතර විග්රහකයා තරමක් මන්දගාමී වන අතර මතකය බඩගිනි වේ. සියලුම jQuery තේරීම්කරුවන්ට ( ළමා තේරීම්කරුවන් වැනි ) හැකි නොවේ. ඕනෑම libxml පදනම් කරගත් පුස්තකාල මෙය පහසුවෙන් අභිබවා යා යුතුය.
PHPHtmlParser යනු සරල, නම්යශීලී, html විග්රහයක් වන අතර එමඟින් jQuery වැනි ඕනෑම CSS තේරීමක් භාවිතා කර ටැග් තෝරා ගැනීමට ඉඩ ලබා දේ. Html වලංගු හෝ වේවා, ඉක්මණින්, පහසු ක්රමයක් අවශ්ය වන මෙවලම් සංවර්ධනය කිරීමට සහාය වීම මෙහි අරමුණයි! මෙම ව්යාපෘතියට මුලින් සහාය දැක්වූයේ සන්රා / පීඑච්පී-සිම්පල්-එච්එම්එල්-ඩොම්-පාර්සර් ය. එහෙත් සහයෝගය නතර වී ඇති බව පෙනේ.
නැවතත්, මම මෙම විග්රහකය නිර්දේශ නොකරමි. ඉහළ CPU භාවිතය සමඟ එය තරමක් මන්දගාමී වේ. සාදන ලද DOM වස්තූන්ගේ මතකය ඉවත් කිරීමට කිසිදු කාර්යයක් නොමැත. මෙම ගැටළු විශේෂයෙන් කැදැලි වළළු සමඟ පරිමාණය කරයි. ප්රලේඛනය සාවද්ය හා අක්ෂර වින්යාසය සහිත වන අතර, අප්රේල් 14 සිට නිවැරදි කිරීම් සඳහා ප්රතිචාර නොමැත.
- විශ්ව ටෝකනයිසර් සහ HTML / XML / RSS DOM විග්රහකය
- මූලද්රව්ය සහ ඒවායේ ගුණාංග හැසිරවීමේ හැකියාව
- අවලංගු HTML සහ UTF8 සඳහා සහය දක්වයි
- මූලද්රව්ය පිළිබඳ උසස් CSS3 වැනි විමසුම් සිදු කළ හැකිය (jQuery වැනි - නාම අවකාශයන් සහාය දක්වයි)
- HTML රූපලාවණ්ය යන්ත්රයක් (HTML පිළිවෙලට වැනි)
- CSS සහ Javascript අවම කරන්න
- ගුණාංග වර්ග කිරීම, අක්ෂර නඩුව වෙනස් කිරීම, නිවැරදි ඉන්ඩෙන්ටේෂන් යනාදිය.
- විස්තාරණය කළ හැකිය
- වත්මන් චරිතය / ටෝකනය මත පදනම්ව ඇමතුම් ලබාගෙන ලේඛන විග්රහ කිරීම
- පහසුවෙන් අභිබවා යාම සඳහා කුඩා කාර්යයන් වලින් වෙන් කරන ලද මෙහෙයුම්
- වේගවත් හා පහසුය
කිසි විටෙකත් එය භාවිතා නොකළේය. එය හොඳ දැයි කිව නොහැක.
HTML5 විග්රහ කිරීම සඳහා ඔබට ඉහත භාවිතා කළ හැකිය, නමුත් HTML5 ඉඩ සලසන සලකුණු කිරීම නිසා විචක්ෂණ විය හැකිය . එබැවින් HTML5 සඳහා ඔබට විශේෂිත පාර්සර් භාවිතා කිරීම වැනි සලකා බැලිය යුතුය
ප්රධාන ඩෙස්ක්ටොප් වෙබ් බ්රව්සර් සමඟ උපරිම ගැළපුම සඳහා WHATWG HTML5 පිරිවිතර මත පදනම් වූ HTML විග්රහයක පයිතන් සහ PHP ක්රියාත්මක කිරීම.
HTML5 අවසන් වූ පසු අපට වඩාත් කැපවූ පාර්සර් දැකිය හැකිය. W3 හි HTML 5 විග්රහ කිරීම සඳහා How-To නම් වූ බ්ලොග් පෝස්ට් එකක් ද තිබේ.
ඔබට PHP ක්රමලේඛනය කිරීමට දැනෙන්නේ නැත්නම්, ඔබට වෙබ් සේවා ද භාවිතා කළ හැකිය. පොදුවේ ගත් කල, මේවා සඳහා මට ඇත්තේ ඉතා අල්ප උපයෝගීතාවකි, නමුත් එය මා සහ මගේ භාවිත අවස්ථා පමණි.
ScraperWiki හි බාහිර අතුරුමුහුණත මඟින් ඔබට වෙබයේ හෝ ඔබේම යෙදුම්වල භාවිතා කිරීමට අවශ්ය ස්වරූපයෙන් දත්ත උකහා ගැනීමට ඉඩ ලබා දේ. ඔබට ඕනෑම සීරීම්කරුවෙකුගේ තත්වය පිළිබඳ තොරතුරු උකහා ගත හැකිය.
අවසාන සහ අවම වශයෙන් නිර්දේශිත , ඔබට සාමාන්ය ප්රකාශන සමඟ HTML වෙතින් දත්ත උකහා ගත හැකිය . සාමාන්යයෙන් HTML හි නිත්ය ප්රකාශන භාවිතා කිරීම අධෛර්යමත් කරනු ලැබේ.
සලකුණු කිරීම ගැලපීම සඳහා ඔබ වෙබයේ සොයා ගන්නා බොහෝ කොටස් අස්ථාවර වේ. බොහෝ අවස්ථාවන්හීදී ඔවුන් වැඩ කරන්නේ විශේෂිත HTML කෑල්ලක් සඳහා පමණි. ටැග් එකක සුදු අවකාශය එක් කිරීම, හෝ ටැගයක ගුණාංග එකතු කිරීම හෝ වෙනස් කිරීම වැනි කුඩා සලකුණු වෙනස්වීම්, රෙජෙක්ස් නිසි ලෙස ලියා නොමැති විට එය අසාර්ථක වීමට හේතු වේ. HTML හි RegEx භාවිතා කිරීමට පෙර ඔබ කරන්නේ කුමක්දැයි ඔබ දැන සිටිය යුතුය.
HTML විග්රහ කරන්නන් දැනටමත් HTML හි සින්ටැක්ටිකල් නීති දන්නවා. ඔබ ලියන සෑම නව RegEx සඳහාම නිත්ය ප්රකාශන ඉගැන්විය යුතුය. RegEx සමහර අවස්ථාවල හොඳයි, නමුත් එය ඇත්ත වශයෙන්ම ඔබගේ භාවිත අවස්ථාව මත රඳා පවතී.
ඔබට වඩාත් විශ්වාසදායක පාර්සර් ලිවිය හැකිය , නමුත් නිත්ය ප්රකාශන සමඟ සම්පූර්ණ හා විශ්වාසදායක අභිරුචි විග්රහයක් ලිවීම ඉහත සඳහන් පුස්තකාල දැනටමත් පවතින අතර මේ පිළිබඳව වඩා හොඳ කාර්යයක් කරන කාලය නාස්තියකි.
ද බලන්න අන්තහ්කරණය HTML වලින් මෙම Cthulhu මාර්ගය
ඔබට යම් මුදලක් වියදම් කිරීමට අවශ්ය නම්, බලන්න
මම PHP ගෘහ නිර්මාණ ශිල්පියා හෝ කතුවරුන් සමඟ සම්බන්ධ වී නොමැත.
සරල HTML DOM විග්රහකය උත්සාහ කරන්න
// 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>';
// 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;
// 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);
DOMDocument-> loadHTML () භාවිතා කර එය සමඟ කරන්න. libxml හි HTML විග්රහ කිරීමේ ඇල්ගොරිතම තරමක් හොඳ සහ වේගවත් වන අතර ජනප්රිය විශ්වාසයන්ට පටහැනිව, විකෘති HTML වලට යටපත් නොවේ.
ඔබ කළ යුත්තේ ඇයි ද සහ ඔබ කළ යුතු සාමාන්ය ප්රකාශනයක භාවිතා?
පළමුවෙන්ම, පොදු වැරදි නාමයක්: 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");
කෙසේ වෙතත් ඔවුන්ට උපකාර කළ හැකි විශේෂිත භාවිත අවස්ථා තිබේ.
<!--
, කෙසේ වෙතත් සමහර විට නිස්සාරණය සඳහා වඩාත් ප්රයෝජනවත් නැංගුරම් වේ. විශේෂයෙන් ව්යාජ HTML විචල්යයන් <$var>
හෝ SGML අපද්රව්ය රීජෙක්ස් සමඟ හීලෑ කිරීම පහසුය.සාමාන්ය ප්රකාශන භාවිතයෙන් HTML ස්නිපටයක් පූර්ව නිස්සාරණය කර /<!--CONTENT-->(.+?)<!--END-->/
ඉතිරි කොටස සරල HTML parser frontends භාවිතයෙන් සැකසීම සමහර විට සුදුසුය.
සටහන: ඇත්ත වශයෙන්ම මා සතුව මෙම යෙදුම ඇත , එහිදී මම විකල්ප වශයෙන් XML විග්රහ කිරීම සහ සාමාන්ය ප්රකාශන භාවිතා කරමි. පසුගිය සතියේ PyQuery විග්රහ කිරීම කැඩී ගිය අතර රීජෙක්ස් තවමත් ක්රියාත්මක විය. ඔව් අමුතුයි, මට එය තනිවම පැහැදිලි කළ නොහැක. නමුත් එය සිදු විය.
එබැවින් කරුණාකර සැබෑ ලෝකයේ සලකා බැලීම්වලට ඡන්දය නොදෙන්න, එය regex = නපුරු මතකයට නොගැලපේ. නමුත් අපි මෙය ඕනෑවට වඩා ඡන්දය නොදෙමු. එය මෙම මාතෘකාව සඳහා පැත්තක් පමණි.
DOMComment
අදහස් කියවිය හැකි බැවින් ඒ සඳහා රීජෙක්ස් භාවිතා කිරීමට හේතුවක් නැත.
DOM
භාවිතා libxml හා libxml වෙනම HTML ව්යාකරණ විග්රහ කර ඇති විට පැටවීම HTML භාවිතා කරනු ඇත මොඩියුලය loadHTML()
ඒ නිසා ඉතා බර "සැබෑ ලෝකය" (බිඳ කියවීමට) HTML පුළුවන්.
චතුර ලෙස 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")
සරල HTML DOM යනු විශිෂ්ට විවෘත කේත විග්රහයකි:
එය DOM මූලද්රව්යයන්ට වස්තු-නැඹුරු ආකාරයකින් සලකන අතර, නව ක්රියාකාරීත්වයට අනුකූල නොවන කේත සඳහා විශාල ආවරණයක් ඇත. ඔබ ජාවාස්ක්රිප්ට් හි දැකිය හැකි “සොයාගන්න” ශ්රිතය වැනි විශිෂ්ට කාර්යයන් කිහිපයක් ඇත, එමඟින් එම ටැග් නාමයේ සියලුම අංග නැවත ලබා දෙනු ඇත.
මම මෙය මෙවලම් ගණනාවක භාවිතා කර ඇති අතර එය විවිධ වර්ගයේ වෙබ් පිටු වල පරීක්ෂා කර ඇති අතර එය විශිෂ්ට ලෙස ක්රියා කරයි.
මා මෙහි සඳහන් කර නැති එක් පොදු ප්රවේශයක් වන්නේ ටයිඩි හරහා HTML ධාවනය කිරීමයි , එය සහතික කළ හැකි වලංගු XHTML පිට කිරීමට කෙළින් හැකිය. එවිට ඔබට එය මත ඕනෑම පැරණි XML පුස්තකාලයක් භාවිතා කළ හැකිය.
නමුත් ඔබේ විශේෂිත ගැටළුවට, ඔබ මෙම ව්යාපෘතිය දෙස බැලිය යුතුය: http://fivefilters.org/content-only/ - එය කියවීමේ හැකියාව ඇල්ගොරිතමයේ නවීකරණය කරන ලද අනුවාදයකි , එය නිර්මාණය කර ඇත්තේ පෙළ අන්තර්ගතය උකහා ගැනීම සඳහාය (ශීර්ෂයන් නොවේ සහ පාදක) පිටුවකින්.
1a සහ 2 සඳහා: මම නව Symfony Componet පන්තියේ DOMCrawler ( DomCrawler ) සඳහා ඡන්දය දෙමි . මෙම පන්තිය CSS තේරීම් වලට සමාන විමසුම් වලට ඉඩ දෙයි. සැබෑ ලෝක උදාහරණ සඳහා මෙම ඉදිරිපත් කිරීම දෙස බලන්න: ප්රවෘත්ති-ඔෆ්-සිම්ෆෝනි 2-වර්ල්ඩ් .
සං component ටකය තනිවම වැඩ කිරීම සඳහා නිර්මාණය කර ඇති අතර එය සිම්ෆනි නොමැතිව භාවිතා කළ හැකිය.
එකම පසුබෑම වන්නේ එය ක්රියාත්මක වන්නේ PHP 5.3 හෝ නවතම ඒවා සමඟ පමණි.
මෙය සාමාන්යයෙන් තිර සීරීම ලෙස හැඳින්වේ . මේ සඳහා මා භාවිතා කර ඇති පුස්තකාලය සරල HTML ඩොම් පාර්සර් ය .
අපි මීට පෙර අපගේ අවශ්යතා සඳහා බඩගා යන ස්වල්පයක් නිර්මාණය කර ඇත්තෙමු. දවස අවසානයේදී, එය සාමාන්යයෙන් සරල නිත්ය ප්රකාශන වේ. ඉහත ලැයිස්තුගත කර ඇති පුස්තකාල ඒවා නිර්මාණය කිරීමට හේතුව හොඳ වුවත්, ඔබ සොයන දේ ඔබ දන්නේ නම්, නිත්ය ප්රකාශන යනු ආරක්ෂිත මාර්ගයකි, මන්ද ඔබට වලංගු නොවන HTML / XHTML ව්යුහයන් ද හැසිරවිය හැකි අතර ඒවා පටවනු ලැබේ නම් අසාර්ථක වනු ඇත. බොහෝ පාර්සර් හරහා.
මම නිර්දේශ කරන්නේ PHP සරල HTML DOM විග්රහකය .
එය ඇත්තෙන්ම හොඳ ලක්ෂණ ඇත, වැනි:
foreach($html->find('img') as $element)
echo $element->src . '<br>';
මෙය W3C XPath තාක්ෂණය පිළිබඳ හොඳ කාර්ය විස්තරයක් සේ පෙනේ. "කූඩුවල ඇති සියලුම href
ගුණාංග img
ටැග් වල ආපසු එවන්න" වැනි විමසුම් ප්රකාශ කිරීම පහසුය <foo><bar><baz> elements
. PHP බෆරයක් නොවීම, XPath ලබා ගත හැකි ස්වරූපයෙන් මට ඔබට පැවසිය නොහැක. HTML ගොනුව සැකසීමට ඔබට බාහිර වැඩසටහනක් ඇමතිය හැකි නම්, ඔබට XPath හි විධාන රේඛා අනුවාදයක් භාවිතා කළ හැකිය. ඉක්මන් හැඳින්වීමක් සඳහා, http://en.wikipedia.org/wiki/XPath බලන්න .
String Parsing වෙනුවට DOM භාවිතා කරන SimpleHtmlDom සඳහා තෙවන පාර්ශවීය විකල්ප: phpQuery , Zend_Dom , QueryPath සහ FluentDom .
ඔව්, ඔබට මේ සඳහා simple_html_dom භාවිතා කළ හැකිය. කෙසේ වෙතත්, මම සරල_එච්එම්එල්_ඩොම් සමඟ බොහෝ සෙයින් වැඩ කර ඇත්තෙමි, විශේෂයෙන් වෙබ් සීරීම් සඳහා සහ එය අනාරක්ෂිත බව සොයාගෙන ඇත. එය මූලික කාර්යය කරන නමුත් මම එය කෙසේ හෝ නිර්දේශ නොකරමි.
මම කිසි විටෙකත් කර්ල් භාවිතා කර නැත, නමුත් මම ඉගෙන ගත් දෙය නම් කර්ල්ට එම කාර්යය වඩාත් කාර්යක්ෂමව කළ හැකි අතර එය වඩාත් .න ය.
කරුණාකර මෙම සබැඳිය පරීක්ෂා කරන්න: සීරීම්-වෙබ් අඩවි-වක්රය සමඟ
QueryPath හොඳයි, නමුත් එහි තේරුම ඔබ නොදැන සිටියේ නම් "තත්වය සොයා ගැනීම" ගැන සැලකිලිමත් වන්න, එයින් අදහස් කරන්නේ ඔබ සිදු වූ දේ සහ කේතය ක්රියා නොකරන්නේ මන්දැයි සොයා ගැනීමට බොහෝ නිදොස් කිරීමේ කාලය නාස්ති කිරීමයි.
එහි තේරුම නම්, ප්රති result ල කට්ටලයේ සෑම ඇමතුමක්ම වස්තුවෙහි ප්රති set ල කට්ටලය වෙනස් කරයි, එය එක් එක් සබැඳිය නව කට්ටලයක් වන jquery හි මෙන් දම්වැල් කළ නොහැකි ය, ඔබට තනි කට්ටලයක් ඇති අතර එය ඔබේ විමසුමේ ප්රති results ල වන අතර එක් එක් ක්රියාකාරී ඇමතුම වෙනස් වේ ඒ තනි කට්ටලය.
Jquery වැනි හැසිරීම ලබා ගැනීම සඳහා, ඔබ පෙරනයක් / මෙහෙයුමක් වැනි වෙනස් කිරීමට පෙර අතු බෙදිය යුතුය, එයින් අදහස් කරන්නේ එය jquery හි සිදුවන දේ වඩාත් සමීපව පිළිබිඹු කරන බවයි.
$results = qp("div p");
$forename = $results->find("input[name='forename']");
$results
input[name='forename']
මුල් විමසුම සඳහා ප්රති set ල කට්ටලය දැන් අඩංගු වන අතර, "div p"
මෙය මට බොහෝ සෙයින් ඉවහල් විය, මම සොයාගත් දෙය නම්, QueryPath විසින් පෙරහන් සහ සොයාගැනීම් සහ ඔබේ ප්රති results ල වෙනස් කරන සහ ඒවා වස්තුව තුළ ගබඩා කරන සියල්ල නිරීක්ෂණය කරයි. ඒ වෙනුවට ඔබ මෙය කළ යුතුයි
$forename = $results->branch()->find("input[name='forname']")
එවිට $results
වෙනස් නොවනු ඇති අතර ඔබට නැවත නැවත සැකසූ ප්රති result ලය නැවත භාවිතා කළ හැකිය, සමහර විට වැඩි දැනුමක් ඇති කෙනෙකුට මෙය මඳක් ඉවත් කළ හැකිය, නමුත් එය මූලික වශයෙන් මා සොයාගත් දෙයින් මේ හා සමාන වේ.
උසස් Html Dom යනු එකම අතුරු මුහුණතක් ලබා දෙන සරල HTML DOM ආදේශනයකි , නමුත් එය DOM මත පදනම් වූ අතර එයින් අදහස් වන්නේ සම්බන්ධිත මතක ගැටළු කිසිවක් සිදු නොවන බවයි.
එයට jQuery දිගු ඇතුළුව පූර්ණ CSS සහාය ඇත.
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
මම 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>');
[...]
PSR-0 අනුකූල පුස්තකාල සඳහා තමන්ගේම ශුන්ය වින්යාස ස්වයංක්රීය යන්ත්රයක් පුස්තකාලයට ඇතුළත් වේ. ඇතුළත් කර ඇති උදාහරණය අමතර වින්යාසයකින් තොරව කොටුවෙන් පිටත ක්රියා කළ යුතුය. විකල්පයක් ලෙස, ඔබට එය රචනා සමඟ භාවිතා කළ හැකිය.
ඔබට උත්සාහ කළ හැකි තවත් විකල්පයක් වන්නේ QueryPath ය . එය දේවානුභාවයෙන් jQuery, නමුත් PHP හි සේවාදායකයේ සහ Drupal හි භාවිතා වේ .
XML_HTMLSax
තරමක් ස්ථායී - එය තවදුරටත් නඩත්තු නොකළද. තවත් විකල්පයක් වනුයේ ඔබට HTML ටයිඩි හරහා HTML නල මාර්ගගත කර සම්මත XML මෙවලම් සමඟ විග්රහ කිරීමයි.
මෙම Symfony රාමුව HTML විග්රහ කළ හැකි අතර, ඔබ තෝරා ගැනීමට CSS ශෛලිය භාවිතා කළ හැකි වන මිටි ඇත ප්රසේසමන ඉවත ලිය භාවිතා වෙනුවට XPath .
HTML / XML DOM සැකසීමට බොහෝ ක්රම තිබේ, ඒවායින් බොහොමයක් දැනටමත් සඳහන් කර ඇත. ඒ නිසා, මම ඒවා ලැයිස්තුගත කිරීමට කිසිදු උත්සාහයක් නොගනිමි.
මට අවශ්ය වන්නේ මා පෞද්ගලිකව 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 ලේඛන විග්රහ කිරීම ද බලන්න .
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');
});
JSON සහ XML වෙතින් අරාව පේළි තුනකින්:
$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
ටා ඩා!
නිත්ය ප්රකාශනයෙන් 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/")));
මම නොමිලයේ ලබා ගත හැකි 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;
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;
}
ඔබ 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 හෝ ටැග් ගුණාංගවල උපුටා දැක්වීම් ද පිළිගනී.