आप PHP में HTML / XML को पार्स और प्रोसेस कैसे करते हैं?


जवाबों:


1896

मूल XML एक्सटेंशन्स

मैं मूल XML एक्सटेंशनों में से एक का उपयोग करना पसंद करता हूं क्योंकि वे PHP के साथ आते हैं, आमतौर पर सभी 3 पार्टी के कामों से तेज होते हैं और मुझे मार्कअप के लिए आवश्यक सभी नियंत्रण प्रदान करते हैं।

डोम

DOM एक्सटेंशन आपको PHP के साथ DOM API के माध्यम से XML दस्तावेज़ों पर काम करने की अनुमति देता है। यह W3C के डॉक्यूमेंट ऑब्जेक्ट ऑब्जेक्ट माडल कोर लेवल 3, एक प्लेटफॉर्म- और भाषा-तटस्थ इंटरफ़ेस का कार्यान्वयन है जो प्रोग्राम्स और स्क्रिप्ट्स को गतिशील रूप से एक्सेस और अपडेट करने की अनुमति देता है। सामग्री, संरचना और दस्तावेजों की शैली।

DOM वास्तविक दुनिया (टूटी हुई) HTML को पार्स और संशोधित करने में सक्षम है और यह XPath क्वेरी कर सकता है । यह libxml पर आधारित है ।

DOM के साथ उत्पादक होने में कुछ समय लगता है, लेकिन यह समय IMO के लायक है। चूंकि DOM एक भाषा-अज्ञेय इंटरफ़ेस है, इसलिए आपको कई भाषाओं में कार्यान्वयन मिलेंगे, इसलिए यदि आपको अपनी प्रोग्रामिंग भाषा को बदलने की आवश्यकता है, तो संभावना है कि आपको पहले से ही पता चल जाएगा कि उस भाषा के DOM API का उपयोग कैसे किया जाए।

एक तत्व के href विशेषता को हथियाने में एक बुनियादी उपयोग उदाहरण पाया जा सकता है और php में DOMDocument में एक सामान्य वैचारिक अवलोकन पाया जा सकता है।

DOM एक्सटेंशन का उपयोग कैसे करें , StackOverflow पर बड़े पैमाने पर कवर किया गया है , इसलिए यदि आप इसका उपयोग करना चुनते हैं, तो आप सुनिश्चित कर सकते हैं कि आपके द्वारा चलाए जाने वाले अधिकांश मुद्दों को स्टैक ओवरफ़्लो खोज / ब्राउज़ करके हल किया जा सकता है।

XMLReader

XMLReader एक्सटेंशन एक XML पुल पार्सर है। पाठक दस्तावेज़ स्ट्रीम पर आगे बढ़ने और रास्ते में प्रत्येक नोड पर रुकने वाले कर्सर के रूप में कार्य करता है।

DOM की तरह XMLReader, libxml पर आधारित है। मुझे पता नहीं है कि HTML पार्सर मॉड्यूल को कैसे ट्रिगर किया जाए, इसलिए टूटे हुए HTML को पार्स करने के लिए XMLReader का उपयोग कर रहे हैं, हो सकता है कि आप DOM का उपयोग करने की तुलना में कम मजबूत हों, जहां आप स्पष्ट रूप से libxml के HTML पार्सर मॉड्यूल का उपयोग करने के लिए कह सकते हैं।

Ph1 का उपयोग करके h1 टैग से सभी मूल्यों को प्राप्त करने पर एक मूल उपयोग उदाहरण पाया जा सकता है

XML पार्सर

यह एक्सटेंशन आपको XML पार्सर बनाने देता है और फिर विभिन्न XML घटनाओं के लिए हैंडलर को परिभाषित करता है। प्रत्येक XML पार्सर में कुछ पैरामीटर भी होते हैं जिन्हें आप समायोजित कर सकते हैं।

XML Parser लाइब्रेरी भी libxml पर आधारित है, और एक SAX शैली XML पुश पार्सर को लागू करती है । यह DOM या SimpleXML की तुलना में मेमोरी मैनेजमेंट का एक बेहतर विकल्प हो सकता है, लेकिन XMLReader द्वारा कार्यान्वित पुल पार्सर की तुलना में काम करना अधिक कठिन होगा।

SimpleXML

सिम्पलेक्सएक्सएमएल एक्सटेंशन एक्सएमएल को एक ऑब्जेक्ट में बदलने के लिए एक बहुत ही सरल और आसानी से उपयोग करने योग्य टूलसेट प्रदान करता है जिसे सामान्य संपत्ति चयनकर्ताओं और सरणी पुनरावृत्तियों के साथ संसाधित किया जा सकता है।

SimpleXML एक विकल्प है जब आप जानते हैं कि HTML वैध है HTML। यदि आपको टूटे हुए HTML को पार्स करने की आवश्यकता है, तो SimpleXml पर भी विचार न करें क्योंकि यह चोक हो जाएगा।

एक बुनियादी उपयोग का उदाहरण देखने पर पाया जा सकता xml फ़ाइल की CRUD नोड और नोड मूल्यों के लिए एक साधारण प्रोग्राम है और वहाँ है पीएचपी मैनुअल में अतिरिक्त उदाहरण के बहुत सारे


3 पार्टी पुस्तकालय (libxml आधारित)

यदि आप एक 3-पक्षीय लिब का उपयोग करना पसंद करते हैं, तो मैं एक ऐसे लिब का उपयोग करने का सुझाव दूंगा, जो वास्तव में स्ट्रिंग स्ट्रिंग के बजाय DOM / libxml का उपयोग करता है ।

फ्लुएंडोम - रेपो

FluentDOM PHP में DOMDocument के लिए एक jQuery की तरह धाराप्रवाह XML इंटरफ़ेस प्रदान करता है। चयनकर्ता XPath या CSS में लिखे गए हैं (CSS से XPath कनवर्टर का उपयोग करके)। वर्तमान संस्करण डोम कार्यान्वयन मानक इंटरफेस का विस्तार करते हैं और डोम लिविंग स्टैंडर्ड से सुविधाएँ जोड़ते हैं। FluentDOM JSON, CSV, JsonML, खरगोश और अन्य जैसे प्रारूपों को लोड कर सकता है। संगीतकार के माध्यम से स्थापित किया जा सकता है।

HtmlPageDom

Wa72 \ HtmlPageDom` का उपयोग करके HTML दस्तावेज़ों के आसान हेरफेर के लिए एक PHP पुस्तकालय है, जिसके लिए DOM ट्री ट्रैवर्स करने के लिए Symfony2 घटकों से DOMCrawler की आवश्यकता होती है और HTML दस्तावेज़ों के DOM ट्री में हेरफेर करने के तरीकों को जोड़कर इसे विस्तारित करता है।

phpQuery (वर्षों से अपडेट नहीं)

phpQuery एक सर्वर-साइड, चेनेबल, CSS3 चयनकर्ता संचालित डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) API है जो PHP5 में लिखे jQuery जावास्क्रिप्ट लाइब्रेरी पर आधारित है और अतिरिक्त कमांड लाइन इंटरफेस (सीएलआई) प्रदान करता है।

इसे भी देखें: https://github.com/electrolinux/phpquery

Zend_Dom

Zend_Dom DOM दस्तावेजों और संरचनाओं के साथ काम करने के लिए उपकरण प्रदान करता है। वर्तमान में, हम Zend_Dom_Query प्रदान करते हैं, जो XPath और CSS चयनकर्ताओं दोनों का उपयोग करते हुए DOM दस्तावेज़ों को क्वेरी करने के लिए एक एकीकृत इंटरफ़ेस प्रदान करता है।

QueryPath

QueryPath XML और HTML में हेरफेर करने के लिए एक PHP लाइब्रेरी है। यह न केवल स्थानीय फ़ाइलों के साथ, बल्कि वेब सेवाओं और डेटाबेस संसाधनों के साथ भी काम करने के लिए डिज़ाइन किया गया है। यह jQuery इंटरफ़ेस (सीएसएस-शैली चयनकर्ताओं सहित) के बहुत से लागू करता है, लेकिन यह सर्वर-साइड उपयोग के लिए भारी है। संगीतकार के माध्यम से स्थापित किया जा सकता है।

fDOMDocument

fDOMDocument PHP चेतावनी या नोटिस के बजाय त्रुटियों के सभी अवसरों पर अपवादों का उपयोग करने के लिए मानक DOM का विस्तार करता है। वे सुविधा के लिए और DOM के उपयोग को सरल बनाने के लिए विभिन्न कस्टम तरीके और शॉर्टकट भी जोड़ते हैं।

कृपाण / xml

कृपाण / xml एक लाइब्रेरी है जो XMLReader और XMLWriter कक्षाओं को लपेटता है और विस्तारित करता है ताकि सिस्टम / डिजाइनिंग मैपिंग सिस्टम और डिज़ाइन पैटर्न के लिए एक सरल "xml" बनाया जा सके। XML लिखना और पढ़ना एकल-पास है और इसलिए तेज़ हो सकता है और बड़ी xml फ़ाइलों पर कम मेमोरी की आवश्यकता होती है।

FluidXML

फ्लूइडएक्सएमएल एक संक्षिप्त और धाराप्रवाह एपीआई के साथ एक्सएमएल में हेरफेर करने के लिए एक PHP पुस्तकालय है। यह XPath और धाराप्रवाह प्रोग्रामिंग पैटर्न को मज़ेदार और प्रभावी बनाता है।


तृतीय-पक्ष (libxml- आधारित नहीं)

DOM / libxml पर निर्माण का लाभ यह है कि आपको बॉक्स से अच्छा प्रदर्शन मिलता है क्योंकि आप मूल एक्सटेंशन पर आधारित हैं। हालांकि, सभी 3-पक्षीय देयताएं इस मार्ग से नीचे नहीं जाती हैं। उनमें से कुछ नीचे सूचीबद्ध हैं

PHP सरल HTML डोम पार्सर

  • PHP5 में लिखा गया HTML DOM पार्सर + आपको बहुत आसान तरीके से HTML में हेरफेर करने देता है!
  • PHP 5+ की आवश्यकता है।
  • अमान्य HTML का समर्थन करता है।
  • एक HTML पृष्ठ पर चयनकर्ताओं के साथ टैग लगाएं जैसे jQuery।
  • HTML से एकल पंक्ति में सामग्री निकालें।

मैं आमतौर पर इस पार्सर की सिफारिश नहीं करता हूं। कोडबेस भयानक है और पार्सर खुद ही धीमी और स्मृति भूख है। सभी jQuery के चयनकर्ता (जैसे बाल चयनकर्ता ) संभव नहीं हैं। किसी भी लिबेक्सिलम आधारित लाइब्रेरी को आसानी से आउटपरफॉर्म करना चाहिए।

PHP एचटीएमएल पार्सर

PHPHtmlParser एक सरल, लचीला, HTML पार्सर है जो आपको jQuery की तरह किसी भी सीएसएस चयनकर्ता का उपयोग करके टैग का चयन करने की अनुमति देता है। लक्ष्य उपकरण के विकास में सहायता करना है जिसके लिए html को स्क्रैप करने के लिए एक त्वरित, आसान तरीका की आवश्यकता है, चाहे वह वैध हो या न हो! यह परियोजना सुनरा / php-simple-html-dom-parser द्वारा समर्थित थी, लेकिन समर्थन बंद हो गया लगता है इसलिए यह परियोजना उनके पिछले कार्य का मेरा अनुकूलन है।

फिर, मैं इस पार्सर की सिफारिश नहीं करूंगा। यह उच्च CPU उपयोग के साथ धीमा है। निर्मित डोम ऑब्जेक्ट्स की मेमोरी को खाली करने के लिए कोई फ़ंक्शन नहीं है। ये समस्याएँ विशेष रूप से नेस्टेड छोरों के साथ होती हैं। 14 अप्रैल 16 के बाद से सुधार के लिए कोई प्रतिक्रिया नहीं होने के साथ ही दस्तावेज गलत और गलत है।

Ganon

  • एक सार्वभौमिक टोकन और HTML / XML / RSS DOM पार्सर
    • तत्वों और उनकी विशेषताओं में हेरफेर करने की क्षमता
    • अमान्य HTML और UTF8 का समर्थन करता है
  • तत्वों पर उन्नत CSS3 के समान प्रश्न कर सकते हैं (जैसे jQuery - नामस्थान समर्थित)
  • एक HTML ब्यूटिफायर (जैसे HTML सुव्यवस्थित)
    • सीएसएस और जावास्क्रिप्ट को छोटा करें
    • सॉर्ट विशेषताएँ, वर्ण मामले में परिवर्तन, सही इंडेंटेशन, आदि।
  • एक्सटेंसिबल
    • वर्तमान चरित्र / टोकन के आधार पर कॉलबैक का उपयोग करके दस्तावेजों को पार्स करना
    • आसान ओवरराइडिंग के लिए छोटे कार्यों में संचालन अलग हो गया
  • तेज और आसान

कभी इसका इस्तेमाल नहीं किया। नहीं बता सकता कि क्या यह कोई अच्छा है।


HTML 5

आप HTML5 को पार्स करने के लिए उपरोक्त का उपयोग कर सकते हैं, लेकिन HTML5 अनुमति मार्कअप के कारण quirks हो सकता है । तो HTML5 के लिए आप एक समर्पित पार्सर का उपयोग करने पर विचार करना चाहते हैं, जैसे

html5lib

मुख्य डेस्कटॉप वेब ब्राउज़र के साथ अधिकतम संगतता के लिए WHATWG HTML5 विनिर्देशन के आधार पर HTML पार्सर का पायथन और PHP कार्यान्वयन।

HTML5 को अंतिम रूप देने के बाद हम अधिक समर्पित पार्सर देख सकते हैं। W3 के शीर्षक के लिए एक ब्लॉगपोस्ट भी है -एचटीएमएल 5 पार्सिंग के लिए हाउ-टू के लिए चेक आउट करने लायक है।


वेब सेवाएं

अगर आपको PHP की प्रोग्रामिंग करने का मन नहीं है, तो आप वेब सेवाओं का भी उपयोग कर सकते हैं। सामान्य तौर पर, मुझे इन के लिए बहुत कम उपयोगिता मिली, लेकिन यह सिर्फ मेरे और मेरे उपयोग के मामले हैं।

स्क्रेपरविकी

स्क्रैपरविकी का बाहरी इंटरफ़ेस आपको उस प्रपत्र में डेटा निकालने की अनुमति देता है जिसे आप वेब पर या अपने स्वयं के अनुप्रयोगों में उपयोग करना चाहते हैं। आप किसी भी खुरचन की स्थिति के बारे में भी जानकारी निकाल सकते हैं।


नियमित अभिव्यक्ति

अंतिम और कम से कम अनुशंसित , आप नियमित अभिव्यक्ति के साथ HTML से डेटा निकाल सकते हैं । सामान्य रूप से HTML पर रेगुलर एक्सप्रेशंस का उपयोग करने से हतोत्साहित किया जाता है।

मार्कअप से मिलान करने के लिए आपको जितने भी स्निपेट मिलेंगे वे भंगुर हैं। ज्यादातर मामलों में वे केवल HTML के एक विशेष टुकड़े के लिए काम कर रहे हैं। टाइनी मार्कअप परिवर्तन, जैसे कि व्हॉट्सएप को कहीं जोड़ना, या टैग में विशेषताओं को जोड़ना या बदलना, RegEx को विफल कर सकता है जब यह ठीक से नहीं लिखा गया हो। आपको पता होना चाहिए कि आप HTML पर RegEx का उपयोग करने से पहले क्या कर रहे हैं।

HTML पार्सर पहले से ही HTML के वाक्यात्मक नियमों को जानते हैं। आपके द्वारा लिखे गए प्रत्येक नए RegEx के लिए नियमित अभिव्यक्ति सिखाई जानी चाहिए। RegEx कुछ मामलों में ठीक हैं, लेकिन यह वास्तव में आपके उपयोग-मामले पर निर्भर करता है।

आप अधिक विश्वसनीय पार्सर लिख सकते हैं , लेकिन नियमित अभिव्यक्तियों के साथ एक पूर्ण और विश्वसनीय कस्टम पार्सर लिखना समय की बर्बादी है जब पूर्वोक्त पुस्तकालय पहले से मौजूद हैं और इस पर बहुत बेहतर काम करते हैं।

Parsing Html The Cthulhu Way भी देखें


पुस्तकें

यदि आप कुछ पैसे खर्च करना चाहते हैं, तो एक नज़र डालें

मैं PHP वास्तुकार या लेखकों के साथ संबद्ध नहीं हूं।


10
@ दिया गया जो आपकी आवश्यकताओं पर निर्भर करता है। मुझे सीएसएस चयनकर्ता प्रश्नों की कोई आवश्यकता नहीं है, यही कारण है कि मैं एक्सपीएक्स के साथ डोम का उपयोग विशेष रूप से करता हूं। phpQuery का लक्ष्य jQuery पोर्ट होना है। Zend_Dom हल्का है। आपको वास्तव में उन्हें देखना होगा कि आपको कौन सा पसंद है।
गॉर्डन

2
@ Ms2ger ज्यादातर, लेकिन पूरी तरह से नहीं। जैसा कि पहले ही ऊपर बताया जा चुका है, आप libxml आधारित पार्सर का उपयोग कर सकते हैं, लेकिन ऐसे विशेष मामले हैं जहां वे चोक हो जाएंगे। यदि आपको अधिकतम अनुकूलता की आवश्यकता है तो आप एक समर्पित पार्सर के साथ बेहतर हैं। मैं भेद रखना पसंद करता हूं।
गॉर्डन

9
PHP सरल HTML DOM पार्सर का उपयोग नहीं करने के लिए आपकी बात मूक लगती है।
पेटा

3
मार्च 29, 2012 के अनुसार, DOM html5 का समर्थन नहीं करता है, XMLReader HTML का समर्थन नहीं करता है और PHP के लिए html5lib पर अंतिम कमिट 2009 को है। HTML5, HTML4 और XHTML को पार्स करने के लिए क्या उपयोग करें?
शिप्लू मोकादिम

4
@ नशा I ने जानबूझकर कुख्यात ज़ाल्गो शेख़ी को ऊपर की सूची से बाहर रखा क्योंकि यह अपने आप में बहुत उपयोगी नहीं है और इसे लिखे जाने के बाद से कुछ कार्गो पंथों के लिए नेतृत्व कर रहा है। लोगों को उस लिंक के साथ थप्पड़ मार दिया गया था, कोई फर्क नहीं पड़ता कि एक समाधान के रूप में रेगेक्स कितना उपयुक्त होगा। एक और अधिक संतुलित राय के लिए, कृपया लिंक मैं देख रहा हूँ था बजाय शामिल हैं और पर टिप्पणी के माध्यम से जाने stackoverflow.com/questions/4245008/...
गॉर्डन

322

सरल HTML डोम पार्सर की कोशिश करो

  • एक HTML DOM parser PHP 5+ में लिखा गया है जो आपको बहुत आसान तरीके से HTML में हेरफेर करने देता है!
  • PHP 5+ की आवश्यकता है।
  • अमान्य HTML का समर्थन करता है।
  • एक HTML पृष्ठ पर चयनकर्ताओं के साथ टैग लगाएं जैसे jQuery।
  • 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
अच्छी तरह से सबसे पहले ऐसी चीजें हैं जो मुझे खराब DOM, Invlid कोड के लिए तैयार करने की आवश्यकता है, DNS DNS इंजन के खिलाफ विश्लेषण करने वाली js, इसका उपयोग दुर्भावनापूर्ण साइटों / सामग्री के लिए बाहर देखने के लिए भी किया जाएगा, जैसे कि मैंने एक रूपरेखा के आसपास अपनी साइट बनाई है। इसे साफ, पठनीय और अच्छी तरह से संरचित करने की आवश्यकता है। SimpleDim महान है, लेकिन कोड थोड़ा गड़बड़ है
RobertPitt

9
@Robert आप भी बाहर की जाँच करने के लिए चाहते हो सकता है htmlpurifier.org सुरक्षा संबंधी बातों के लिए।
गॉर्डन

3
उसे एक वैध बिंदु मिला है: simpleHTMLDOM को विस्तारित करना मुश्किल है, जब तक कि आप डेकोरेटर पैटर्न का उपयोग नहीं करते हैं, जो मुझे अनडेली लगता है। मैंने पाया अपने आप को कंपकंपी सिर्फ अंतर्निहित वर्ग में परिवर्तन (ते) खुद को बना रही है।
एरिक

1
मैंने SimpleDOM को भेजने से पहले अपने html को tidy के माध्यम से चलाया था।
MB34

1
मैं वर्तमान में इसका उपयोग कर रहा हूं, इसे कुछ सौ url संसाधित करने के लिए एक परियोजना के भाग के रूप में चला रहा हूं। यह बहुत धीमा होता जा रहा है और नियमित रूप से टाइमआउट जारी रहता है। यह एक महान शुरुआती स्क्रिप्ट है और सीखने के लिए सहज रूप से सरल है, लेकिन अधिक उन्नत परियोजनाओं के लिए बस बहुत ही बुनियादी है।
luke_mclachlan 14

236

बस DOMDocument-> loadHTML () का उपयोग करें और इसके साथ किया जाए। libxml का HTML पार्सिंग एल्गोरिथ्म काफी अच्छा और तेज है, और लोकप्रिय धारणा के विपरीत, विकृत HTML पर चोक नहीं करता है।


19
सच। और यह PHP के अंतर्निहित XPath और XSLTProcessor वर्गों के साथ काम करता है, जो सामग्री निकालने के लिए महान हैं।
कोर्नेल

8
वास्तव में एचटीएमएल के लिए, आप इसे डोम से बंद करने से पहले हमेशा htmltidy के माध्यम से चला सकते हैं। जब भी मुझे HTML से डेटा को स्क्रैप करने की आवश्यकता होती है, तो मैं हमेशा DOM, या कम से कम सिम्प्लेक्स का उपयोग करता हूं।
फ्रैंक किसान

9
विकृत HTML लोड करने के साथ एक और बात यह है कि चेतावनी को रोकने के लिए libxml_use_internal_errors (true) को कॉल करना बुद्धिमान हो सकता है जो पार्स करना बंद कर देगा।
हस्की

6
मैंने बिना किसी मुद्दे के लगभग 1000 HTML स्रोतों (विभिन्न भाषाओं में अलग-अलग वर्णमालाओं से कूटबद्ध) को पार्स करने के लिए DOMDocument का उपयोग किया है। आप इसके साथ एन्कोडिंग समस्याओं में भाग सकते हैं, लेकिन वे दुर्गम नहीं हैं। आपको 3 चीजें जानने की जरूरत है: 1) लोडबुक एन्कोडिंग 2 का निर्धारण करने के लिए मेटा टैग के चारसेट का उपयोग करता है) # 2 गलत एन्कोडिंग का पता लगा सकता है यदि HTML सामग्री में यह जानकारी शामिल नहीं है 3) खराब यूटीएफ -8 वर्ण पार्सर की यात्रा कर सकते हैं। ऐसे मामलों में, वर्कबाउंड्स के लिए mb_detect_encoding () और सिंपली आरएसएस RSS पार्सर की एन्कोडिंग / परिवर्तित / खराब यूटीएफ -8 वर्ण कोड के संयोजन का उपयोग करें।
शून्य

1
DOM वास्तव में XPath का समर्थन करता है, DOMXPath पर एक नज़र डालें
रयान मैक्यू

147

आपको क्यों नहीं करना चाहिए और आपको नियमित अभिव्यक्ति का उपयोग कब करना चाहिए ?

सबसे पहले, एक सामान्य मिथ्या नाम: Regexps " पार्सिंग " HTML के लिए नहीं है । Regexes हालांकि डेटा को " एक्सट्रैक्ट " कर सकता है । निकालने के लिए वे क्या कर रहे हैं। उचित SGML टूलकिट या बेसलाइन XML पार्सर पर रेगेक्स एचटीएमएल निष्कर्षण की बड़ी खामी उनके क्रमिक प्रयास और अलग-अलग विश्वसनीयता हैं।

इस बात पर विचार करें कि कुछ हद तक भरोसेमंद HTML निष्कर्षण regex:

<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 टिप्पणियों को प्रकट नहीं किया जाता है <!--, जो हालांकि कभी-कभी निष्कर्षण के लिए अधिक उपयोगी एंकर होते हैं। विशेष रूप से छद्म एचटीएमएल भिन्नरूपों <$var>या एसजीएमएल अवशेषों को रेक्सएक्सप्स के साथ जोड़ना आसान है।
  • अक्सर नियमित अभिव्यक्तियाँ पोस्ट-प्रोसेसिंग को बचा सकती हैं। हालाँकि HTML संस्थाओं को अक्सर मैनुअल केयरटेकिंग की आवश्यकता होती है।
  • और अंत में, ई xtremely सरल कार्यों जैसे कि निकालने के लिए <img src = urls, वे वास्तव में एक संभावित उपकरण हैं। एसजीएमएल / एक्सएमएल पार्सर्स पर गति का लाभ ज्यादातर इन बुनियादी निकासी प्रक्रियाओं के लिए खेलने के लिए आता है।

यह कभी-कभी नियमित अभिव्यक्तियों का उपयोग करके HTML के एक स्निपेट को निकालने /<!--CONTENT-->(.+?)<!--END-->/और सरल HTML पार्सर के उपयोग से शेष को संसाधित करने के लिए भी उचित है ।

नोट: मेरे पास वास्तव में यह ऐप है , जहां मैं XML पार्सिंग और नियमित अभिव्यक्ति को वैकल्पिक रूप से नियोजित करता हूं। अभी पिछले सप्ताह ही PyQuery पार्सिंग टूट गया, और रेगेक्स ने अभी भी काम किया। हाँ अजीब है, और मैं इसे खुद नहीं समझा सकता। लेकिन ऐसा हुआ।
इसलिए कृपया वास्तविक दुनिया के मतों को नीचे मत डालें, क्योंकि यह रेगेक्स = बुराई मेमे से मेल नहीं खाता है। लेकिन चलो यह भी बहुत ज्यादा मतदान नहीं करते हैं। यह इस विषय के लिए सिर्फ एक विचारधारा है।


20
DOMCommentटिप्पणियों को पढ़ सकते हैं, इसलिए रेगेक्स का उपयोग करने का कोई कारण नहीं है।
गॉर्डन

4
वास्तविक दुनिया HTML पार्स करने के लिए न तो SGML टूलकिट या XML पार्सर उपयुक्त हैं। उसके लिए, केवल एक समर्पित HTML पार्सर उपयुक्त है।
Alohci

12
@Alohci ने libxml DOMका उपयोग किया है और libxml का एक अलग HTML पार्सर मॉड्यूल है, जिसका उपयोग HTML लोड करते समय किया जाएगा loadHTML()ताकि यह "वास्तविक दुनिया" (टूटी हुई) HTML को बहुत अधिक लोड कर सके।
गॉर्डन

6
ठीक है, आपके "वास्तविक दुनिया के विचार" के दृष्टिकोण के बारे में सिर्फ एक टिप्पणी। निश्चित रूप से, HTML को पार्स करते समय रेगेक्स के लिए उपयोगी परिस्थितियां हैं। और गोटो का उपयोग करने के लिए उपयोगी परिस्थितियां भी हैं। और चर-चर के लिए उपयोगी स्थितियां हैं। इसलिए इसका उपयोग करने के लिए कोई विशेष कार्यान्वयन निश्चित रूप से कोड-रोट नहीं है। लेकिन यह एक बहुत मजबूत चेतावनी संकेत है। और अंतर को बताने के लिए औसत डेवलपर के पास पर्याप्त मात्रा में होने की संभावना नहीं है। इसलिए, एक सामान्य नियम के रूप में, रेगेक्स गोटो और चर-चर सभी बुरी हैं। गैर-बुराई उपयोग हैं, लेकिन वे अपवाद हैं (और उस पर दुर्लभ) ... (IMHO)
ircmaxell

11
@mario: वास्तव में, HTML को रेगीक्स का उपयोग करके 'ठीक से' पार्स किया जा सकता है, हालांकि आमतौर पर निष्पक्ष काम करने के लिए उनमें से कई को ले जाता है। यह सामान्य मामले में सिर्फ एक शाही दर्द है। विशिष्ट मामलों में अच्छी तरह से परिभाषित इनपुट के साथ, यह तुच्छ पर क्रिया करता है। वे ऐसे मामले हैं जिन पर लोगों को regexes का उपयोग करना चाहिए। बड़े पुराने भूखे भारी पार्सर वास्तव में वही होते हैं जिनकी आपको सामान्य मामलों में आवश्यकता होती है, हालांकि यह आकस्मिक उपयोगकर्ता के लिए हमेशा स्पष्ट नहीं होता है कि वह रेखा कहाँ खींचनी है। जो भी कोड सरल और आसान है, जीतता है।
tchrist

131

धाराप्रवाह jQuery एपीआई की नकल करने में phpQuery और QueryPath बेहद समान हैं। यही कारण है कि वे PHP में HTML को ठीक से पार्स करने के दो सबसे आसान तरीके हैं ।

QueryPath के उदाहरण

मूल रूप से आप पहली बार HTML स्ट्रिंग से एक क्वेरी करने योग्य DOM ट्री बनाते हैं:

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

परिणामी ऑब्जेक्ट में HTML दस्तावेज़ का पूर्ण ट्री प्रतिनिधित्व शामिल है। यह डोम तरीकों का उपयोग करके ट्रेस किया जा सकता है। लेकिन आम तरीका jQuery में CSS चयनकर्ताओं का उपयोग करना है:

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

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

अधिकतर आप सरल #idऔर .classया DIVटैग चयनकर्ताओं का उपयोग करना चाहते हैं ->find()। लेकिन आप XPath स्टेटमेंट का भी उपयोग कर सकते हैं , जो कभी-कभी तेज होते हैं। इसके अलावा ठेठ jQuery के तरीकों ->children()और ->text()और विशेष रूप ->attr()से सही HTML स्निपेट निकालने को सरल बनाते हैं। (और पहले से ही उनकी एसजीएमएल इकाइयां डिकोड हो गई हैं।)

 $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 भी कुछ छद्म AJAX विधियों (सिर्फ HTTP अनुरोध) को अधिक बारीकी से लागू करता है jQuery से मिलता जुलता है। ऐसा कहा जाता है कि QupPath (कम समग्र विशेषताओं के कारण) से phpQuery अक्सर तेज होता है।

मतभेदों के बारे में अधिक जानकारी के लिए टैगबाइट मशीन से टैगबैक मशीन पर इस तुलना को देखें । (मूल स्रोत गायब हो गया है, इसलिए यहां एक इंटरनेट संग्रह लिंक है। हां, आप अभी भी लापता पृष्ठों, लोगों का पता लगा सकते हैं।)

और यहाँ एक व्यापक क्वेरीपथ परिचय है

लाभ

  • सादगी और विश्वसनीयता
  • विकल्पों का उपयोग करने के लिए सरल ->find("a img, a object, div a")
  • उचित डेटा अनसेफ़िंग (नियमित एक्सप्रेशन की तुलना में)

88

साधारण HTML DOM एक बेहतरीन ओपन-सोर्स पार्सर है:

simplehtmldom.sourceforge

यह DOM ऑब्जेक्ट को ऑब्जेक्ट-ओरिएंटेड तरीके से व्यवहार करता है, और नए चलना में गैर-अनुपालन कोड के लिए बहुत अधिक कवरेज है। कुछ महान कार्य भी हैं जैसे आप जावास्क्रिप्ट में देखेंगे, जैसे कि "खोज" फ़ंक्शन, जो उस टैग नाम के तत्वों के सभी उदाहरणों को वापस कर देगा।

मैंने कई उपकरणों में इसका उपयोग किया है, कई अलग-अलग प्रकार के वेब पृष्ठों पर इसका परीक्षण किया है, और मुझे लगता है कि यह बहुत अच्छा काम करता है।


61

एक सामान्य दृष्टिकोण जो मैंने यहां नहीं देखा है , वह टीआईडी ​​के माध्यम से HTML चलाना है , जिसे गारंटीकृत-वैध एक्सएचटीएमएल थूकने के लिए सेट किया जा सकता है। फिर आप उस पर किसी भी पुराने XML पुस्तकालय का उपयोग कर सकते हैं।

लेकिन आपकी विशिष्ट समस्या के लिए, आपको इस परियोजना पर एक नज़र डालनी चाहिए: http://fivefilters.org/content-only/ - यह पठनीयता एल्गोरिथ्म का एक संशोधित संस्करण है , जिसे केवल पाठ्य सामग्री (हेडर नहीं) को निकालने के लिए डिज़ाइन किया गया है और पाद) एक पृष्ठ से।


56

1 ए और 2 के लिए: मैं नए सिम्फनी कम्पोनेट वर्ग DOMCrawler ( DOMCrawler ) के लिए मतदान करूंगा । यह वर्ग CSS चयनकर्ताओं के समान प्रश्नों की अनुमति देता है। वास्तविक दुनिया उदाहरण के लिए इस प्रस्तुति पर एक नज़र डालें: खबर ऑफ द symfony2 दुनिया

घटक को स्टैंडअलोन काम करने के लिए डिज़ाइन किया गया है और इसका उपयोग सिम्फनी के बिना किया जा सकता है।

एकमात्र दोष यह है कि यह केवल PHP 5.3 या नए के साथ काम करेगा।


jquery की तरह css क्वेश्चन अच्छी तरह से कहा जाता है, क्योंकि कुछ चीजें हैं जो w3c प्रलेखन में गायब हैं, लेकिन jquery में अतिरिक्त सुविधाओं के रूप में मौजूद हैं।
निकोला पेटकांस्की

53

यह आमतौर पर स्क्रीन स्क्रैपिंग के रूप में संदर्भित होता है, वैसे। मैंने इसके लिए जिस लाइब्रेरी का उपयोग किया है वह सिंपल HTML डॉम पार्सर है


8
सख्ती से सच नहीं ( en.wikipedia.org/wiki/Screen_scraping#Screen_scraping )। सुराग "स्क्रीन" में है; वर्णित मामले में, कोई स्क्रीन शामिल नहीं है। हालाँकि, माना जाता है कि इस शब्द को हाल ही में दुरुपयोग का एक बहुत बुरा सामना करना पड़ा है।
बॉबी जैक

4
Im स्क्रीन स्क्रेपिंग नहीं है, जो सामग्री पार्स की जाएगी वह मेरे अनुबंध के तहत सामग्री आपूर्तिकर्ता द्वारा अधिकृत होगी।
राबर्टपिट 17

41

हमने पहले अपनी जरूरतों के लिए काफी क्रॉलर बनाए हैं। दिन के अंत में, यह आमतौर पर सरल नियमित अभिव्यक्ति होती है जो सबसे अच्छा काम करती है। जबकि ऊपर सूचीबद्ध पुस्तकालय उनके द्वारा बनाए गए कारण के लिए अच्छे हैं, यदि आप जानते हैं कि आप क्या देख रहे हैं, तो नियमित अभिव्यक्ति जाने का एक सुरक्षित तरीका है, क्योंकि आप गैर-वैध HTML / XHTML संरचनाओं को भी संभाल सकते हैं , जो लोड होने पर विफल हो जाएंगे अधिकांश पार्सरों के माध्यम से।



36

यह W3C XPath तकनीक के एक अच्छे कार्य विवरण जैसा लगता है । " टैग hrefमें मौजूद सभी विशेषताओं को वापस लौटाएं" जैसे प्रश्नों को व्यक्त करना आसान है । PHP बफ़ नहीं होने के कारण, मैं आपको नहीं बता सकता कि XPath किस रूप में उपलब्ध हो सकता है। यदि आप HTML फ़ाइल को संसाधित करने के लिए किसी बाहरी प्रोग्राम को कॉल कर सकते हैं तो आपको XPath के कमांड लाइन संस्करण का उपयोग करने में सक्षम होना चाहिए। एक त्वरित परिचय के लिए, http://en.wikipedia.org/wiki/XPath देखें ।img<foo><bar><baz> elements


29

SimpleHtmlDom के लिए तीसरे पक्ष के विकल्प जो स्ट्रिंग पार्सिंग के बजाय DOM का उपयोग करते हैं: phpQuery , Zend_Dom , QueryPath और FluentDom


3
यदि आप पहले से ही मेरी टिप्पणियों को कॉपी करते हैं, तो कम से कम उन्हें ठीक से लिंक करें;) यह होना चाहिए: SimpleHtmlDom के लिए तीसरे पक्ष के विकल्प सुझाए गए जो वास्तव में स्ट्रिंग पार्सिंग के बजाय DOM का उपयोग करते हैं : phpQuery , Zend_Dom , QueryPath और FluentDom
गॉर्डन

1
अच्छे उत्तर एक महान स्रोत हैं। stackoverflow.com/questions/3606792/…
danidacar

24

हां आप इस उद्देश्य के लिए simple_html_dom का उपयोग कर सकते हैं। हालाँकि मैंने simple_html_dom के साथ बहुत काम किया है, विशेष रूप से वेब स्क्रैपिंग के लिए और इसे बहुत कमजोर पाया है। यह मूल काम करता है, लेकिन मैं इसे वैसे भी अनुशंसित नहीं करूंगा।

मैंने कभी भी उद्देश्य के लिए कर्ल का उपयोग नहीं किया है, लेकिन मैंने जो सीखा है वह यह है कि कर्ल बहुत अधिक कुशलता से काम कर सकता है और बहुत अधिक ठोस है।

कृपया इस लिंक को देखें: स्क्रैपिंग-वेबसाइट्स-साथ-कर्ल


2
कर्ल फ़ाइल प्राप्त कर सकते हैं , लेकिन यह आपके लिए HTML को पार्स नहीं करेगा। वह कठिन हिस्सा है।
cHao

23

QueryPath अच्छा है, लेकिन "ट्रैकिंग स्थिति" कारण से सावधान रहें यदि आपको एहसास नहीं है कि इसका क्या मतलब है, तो इसका मतलब यह हो सकता है कि आप बहुत डिबगिंग समय बर्बाद कर सकते हैं यह जानने की कोशिश करें कि क्या हुआ और क्यों कोड काम नहीं करता है।

इसका क्या अर्थ है कि परिणाम सेट पर प्रत्येक कॉल ऑब्जेक्ट में सेट किए गए परिणाम को संशोधित करता है, यह जंकरी की तरह श्रृंखला योग्य नहीं है जहां प्रत्येक लिंक एक नया सेट है, आपके पास एक सेट है जो आपकी क्वेरी से परिणाम है और प्रत्येक फ़ंक्शन कॉल संशोधित करता है वह एकल सेट।

jquery- जैसा व्यवहार पाने के लिए, आपको फ़िल्टर करने / ऑपरेशन की तरह संशोधित करने से पहले शाखा करने की आवश्यकता होती है, इसका मतलब है कि यह दर्पण होगा जो jquery में बहुत अधिक निकटता से होता है।

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

$resultsअब परिणाम के लिए सेट input[name='forename']नहीं है मूल क्वेरी नहीं "div p"यह मुझे बहुत परेशान करता है , जो मैंने पाया था कि क्वेरीथ फिल्टर और पाता है और सब कुछ जो आपके परिणामों को संशोधित करता है और उन्हें ऑब्जेक्ट में संग्रहीत करता है। आपको इसके बजाय यह करने की आवश्यकता है

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

तब $resultsसंशोधित नहीं किया जाएगा और आप बार-बार सेट किए गए परिणाम का पुन: उपयोग कर सकते हैं, शायद बहुत अधिक ज्ञान वाला कोई व्यक्ति इसे थोड़ा साफ कर सकता है, लेकिन यह मूल रूप से इस तरह से है जैसा मैंने पाया है।


20

उन्नत एचटीएमएल डोम एक साधारण एचटीएमएल डोम रिप्लेसमेंट है जो समान इंटरफ़ेस प्रदान करता है, लेकिन यह डोम-आधारित है जिसका अर्थ है कि संबंधित मेमोरी में से कोई भी समस्या नहीं होती है।

इसमें jQuery एक्सटेंशन सहित पूर्ण सीएसएस समर्थन भी है ।


मुझे उन्नत एचटीएमएल डोम से अच्छे परिणाम मिले हैं, और मुझे लगता है कि यह स्वीकृत उत्तर की सूची में होना चाहिए। एक महत्वपूर्ण बात यह है कि किसी पर भी भरोसा करने के लिए "इस परियोजना का लक्ष्य PHP के सरल HTML डोम लाइब्रेरी के लिए एक DOM- आधारित ड्रॉप-इन प्रतिस्थापन होना है ... यदि आप फ़ाइल / str_get_html का उपयोग करते हैं तो आपको इसकी आवश्यकता नहीं है कुछ भी बदलो। " संग्रह .is/QtSuj#selection-933.34-933.100 कुछ असंगतताओं को समायोजित करने के लिए आपको अपने कोड में परिवर्तन करने की आवश्यकता हो सकती है। मैंने इस परियोजना के गितुब मुद्दों में मेरे लिए ज्ञात चार नोट किए हैं। github.com/monkeysuffrage/advanced_html_dom/issues
ChrisJJ

काम किया! साभार
फैसल शनि

18

के लिए एचटीएमएल 5 , एचटीएमएल 5 lib अब साल के लिए त्याग दिया गया है। केवल HTML5 लाइब्रेरी जिसे मैं हाल ही में अपडेट और रखरखाव रिकॉर्ड के साथ पा सकता हूं, एचटीएमएल 5-पीएचपी है जिसे अभी एक हफ्ते पहले 1.0 बीटा बीटा में लाया गया था।


17

मैंने एक सामान्य उद्देश्य XML पार्सर लिखा है जो आसानी से GB फ़ाइलों को संभाल सकता है। यह 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 नाम से एक लाइब्रेरी बनाई , जो आपको उसी तरह HTML5 और XML दस्तावेज़ों को क्रॉल करने की अनुमति देता है, जैसे आप jQuery के साथ करते हैं।

हुड के तहत, यह सीएसएस चयनकर्ताओं को XPath चयनकर्ताओं में परिवर्तित करने के लिए सिम्फनी / डोम क्रॉलर का उपयोग करता है । यह हमेशा एक ही DOMDocument का उपयोग करता है, यहां तक ​​कि जब एक वस्तु को दूसरे के पास भेजा जाता है, तो सभ्य प्रदर्शन सुनिश्चित करने के लिए।


उदाहरण का उपयोग करें:

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 Worpress में लोड नहीं हो रहा है। कैसे इसे सही ढंग से शामिल करने के बारे में कोई अतिरिक्त निर्देश ?. इसे शामिल करें: परिभाषित करें ("BASE_PATH", dirname ( FILE )); परिभाषित ("LIBRARY_PATH", BASE_PATH। DIRECTORY_SEPARATOR। 'lib / seller'); LIBRARY_PATH की आवश्यकता है। DIRECTORY_SEPARATOR। 'Loader.php'; लोडर :: init (सरणी (LIBRARY_PATH, USER_PATH)); फ़ंक्शन में।
एफपी

15

आप किसी भी "टूटे हुए" HTML को साफ करने और HTML को एक्सएचटीएमएल में बदलने के लिए एचटीएमएल टाइड जैसी किसी चीज का उपयोग करने की कोशिश कर सकते हैं, जिसे आप तब XML पार्सर के साथ पार्स कर सकते हैं।


15

एक और विकल्प आप कोशिश कर सकते हैं QueryPath है । यह jQuery से प्रेरित है, लेकिन PHP में सर्वर पर और Drupal में उपयोग किया जाता है ।


12

XML_HTMLSaxबल्कि स्थिर है - भले ही यह किसी भी अधिक बनाए रखा नहीं है। एक अन्य विकल्प यह हो सकता है कि आप HTML को Html Tidy के माध्यम से पाइप करें और फिर इसे मानक XML टूल के साथ पार्स करें।


11

Symfony ढांचे बंडलों जो एचटीएमएल पार्स कर सकते है, और आप का चयन करने के सीएसएस शैली का उपयोग कर सकते DOMS उपयोग करने के बजाए XPath


11

HTML / XML DOM को प्रोसेस करने के कई तरीके हैं जिनमें से अधिकांश का उल्लेख पहले ही किया जा चुका है। इसलिए, मैं खुद को सूचीबद्ध करने का कोई प्रयास नहीं करूंगा।

मैं केवल यह जोड़ना चाहता हूं कि मैं व्यक्तिगत रूप से DOM एक्सटेंशन का उपयोग करना पसंद कर रहा हूं और क्यों:

  • iit अंतर्निहित C कोड के प्रदर्शन लाभ का इष्टतम उपयोग करता है
  • यह OO PHP है (और मुझे इसे उप-करने की अनुमति देता है)
  • यह बल्कि निम्न स्तर है (जो मुझे अधिक उन्नत व्यवहार के लिए गैर-फलीभूत नींव के रूप में उपयोग करने की अनुमति देता है)
  • यह DOM के हर हिस्से तक पहुँच प्रदान करता है (उदाहरण के लिए। SimpleXml, जो कम ज्ञात XML विशेषताओं में से कुछ को अनदेखा करता है)
  • इसमें DOM रेंगने के लिए एक सिंटैक्स का उपयोग किया गया है जो कि मूल जावास्क्रिप्ट में उपयोग किए गए सिंटैक्स के समान है।

और जब मैं सीएसएस चयनकर्ताओं का उपयोग करने की क्षमता को याद करता हूं DOMDocument, तो इस सुविधा को जोड़ने के लिए एक सरल और सुविधाजनक तरीका है: सब-क्लासिंग DOMDocumentऔर जेएस-जैसे querySelectorAllऔर querySelectorतरीकों को अपने उपवर्ग में जोड़ना ।

चयनकर्ताओं को पार्स करने के लिए, मैं सिम्फनी ढांचे से बहुत न्यूनतर CssSelector घटक का उपयोग करने की सलाह देता हूं । यह घटक सिर्फ CSS चयनकर्ताओं को XPath चयनकर्ताओं में अनुवाद करता है, जिसे बाद में संबंधित नोडलिस्ट को प्राप्त करने के लिए खिलाया जा सकता है ।DOMXpath

तब आप इसका उपयोग कर सकते हैं (अभी भी बहुत कम स्तर) उपवर्ग को और अधिक उच्च स्तर की कक्षाओं के लिए एक नींव के रूप में, उदाहरण के लिए। बहुत विशिष्ट प्रकार के XML को पार्स करें या अधिक jQuery की तरह व्यवहार जोड़ें।

नीचे दिया गया कोड मेरी DOM-Query लाइब्रेरी से सीधे बाहर आता है और मेरे द्वारा बताई गई तकनीक का उपयोग करता है।

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 घटक बनाने और इसका उपयोग करने के तरीके के बारे में अपने निर्णय पर सिम्फनी के निर्माता फैबिन पोटेंसीयर द्वारा सीएसएस चयनकर्ताओं के साथ पार्सिंग एक्सएमएल दस्तावेजों को भी देखें ।


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;

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 या गुम उद्धरण भी स्वीकार करता है।


0

पार्स 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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.