php

2011-02-12 3 views
24

में DOMDocument दस्तावेज़ में क्रॉल और पार्स करने के लिए मैंने दस्तावेज़ों और डीओएम के बारे में उदाहरण पढ़ना शुरू कर दिया है।php

उदाहरण के लिए मैं दस्तावेज़ के भाग के नीचे से पता चला है:

:

<div id="showContent"> 
    <table> 
    <tr> 
     <td> 
     Crap 
     </td> 
    </tr> 
<tr> 
      <td width="172" valign="top"><a href="link"><img height="91" border="0" width="172" class="" src="img"></a></td> 
      <td width="10">&nbsp;</td> 
      <td valign="top"><table cellspacing="0" cellpadding="0" border="0"> 
       <tbody><tr> 
       <td height="30"><a class="px11" href="link">title</a><a><br> 
        <span class="px10"></span> 
       </a></td> 
       </tr> 
       <tr> 
       <td><img height="1" width="580" src="crap"></td> 
       </tr> 
       <tr> 
       <td align="right"> 
        <a href="link"><img height="16" border="0" width="65" src="/buy"></a> 
       </td> 
       </tr> 
       <tr> 
       <td valign="top" class="px10"> 
        <p style="width: 500px;">description.</p> 
       </td> 
       </tr> 
      </tbody></table></td> 
     </tr> 
    <tr> 
     <td> 
Crap 
     </td> 
    </tr> 
    <tr> 
     <td> 
     Crap 
     </td> 
    </tr> 
    </table> 
    </div> 

मैं बकवास या उन्हें अंदर जानकारी नहीं है कि क्या सभी tr टैग मिलता है और विश्लेषण करने के लिए निम्नलिखित कोड का उपयोग करने की कोशिश कर रहा हूँ

$dom = new DOMDocument(); 
@$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 


$tags = $xpath->query('.//div[@id="showContent"]'); 
foreach ($tags as $tag) { 
    $string=""; 
    $string=trim($tag->nodeValue); 
    if(strlen($string)>3) { 
     echo $string; 
     echo '<br>'; 
    } 
} 

हालांकि मैं टैग के बिना सिर्फ छीन स्ट्रिंग हो रही है, उदाहरण के लिए:

Crap 

Crap 
Title 
Description 
,210

लेकिन मैं चाहते हैं पाने के लिए:

<tr> 
    <td>Crap</td> 
</tr> 
<tr> 
    <a href="link">title</a> 
</tr> 

कैसे एचटीएमएल नोड्स (टैग) रखने के लिए?

+2

सी [PHP के DOMDocument में innerHTML] (http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument)। – netcoder

+2

आपका XPath div से मेल खाता है। आपके द्वारा दिखाए गए HTML को प्राप्त करने के लिए, आपको अलग-अलग XPath क्वेरी/क्वेरीज़ का उपयोग करना होगा और फिर परिणामों को 'echo $ dom-> save ($ node)' पर पास करना होगा। कृपया स्पष्ट करें कि आप क्या प्राप्त करने का प्रयास कर रहे हैं। – Gordon

+0

@netcoder आंतरिक HTML यहां बिल्कुल आवश्यक नहीं है। – Gordon

उत्तर

63

यदि आप डोम के साथ काम करना चाहते हैं तो आपको अवधारणा को समझना होगा। डीओएम दस्तावेज़ सहित डीओएम दस्तावेज़ में सबकुछ एक नोड है।

DOMDocument नोड्स का एक पदानुक्रमित वृक्ष संरचना है। यह रूट नोड के साथ शुरू होता है। उस रूट नोड में बच्चे नोड्स हो सकते हैं और इन सभी बच्चों के नोड्स में बच्चे नोड्स हो सकते हैं। मूल रूप से DOMDocument में सब कुछ किसी प्रकार का नोड प्रकार है, चाहे वह तत्व, गुण या टेक्स्ट सामग्री हो।

  HTML        Legend: 
     / \        UPPERCASE = DOMElement 
     HEAD BODY       lowercase = DOMAttr 
    /  \       "Quoted" = DOMText 
    TITLE  DIV - class - "header" 
    |    \ 
"The Title"  H1 
        | 
      "Welcome to Nodeville" 

उपरोक्त चित्र कुछ नोड्स के साथ एक DOMDocument दिखाता है। दो बच्चों (सिर और शरीर) के साथ एक मूल तत्व (एचटीएमएल) है। कनेक्टिंग लाइनों को अक्ष कहा जाता है। यदि आप अक्ष तत्व को TITLE तत्व पर फ़ॉलो करते हैं, तो आप देखेंगे कि इसमें एक DOMText पत्ता है। यह महत्वपूर्ण है क्योंकि यह अक्सर अनदेखा चीज दिखाता है:

<title>The Title</title> 

एक नहीं है, लेकिन दो नोड्स हैं। एक डोमटेक्स्ट बच्चे के साथ एक समझौता। एक DOMAttr एक DOMText पकड़े साथ DOMElement: इसी तरह, इस

<div class="header"> 

वास्तव में तीन नोड्स है। चूंकि ये सभी डोमोडोड से उनके गुणों और विधियों का उत्तराधिकारी हैं, इसलिए DOMNode class.

अभ्यास में, इसका मतलब है कि आपके द्वारा प्राप्त DIV दस्तावेज़ में अन्य सभी नोड्स से जुड़ा हुआ है। आप रूट तत्व या किसी भी समय पत्तियों तक नीचे जा सकते हैं। यह सब वहाँ है। आपको वांछित जानकारी के लिए दस्तावेज़ को पूछना या ट्रैफिक करना होगा।

चाहे आप के childNodes को पुन: स्थापित करके करते हैं या getElementByTagName() या XPath का उपयोग करते हैं। आपको बस यह समझना होगा कि आप कच्चे HTML के साथ काम नहीं कर रहे हैं, लेकिन पूरे HTML दस्तावेज़ का प्रतिनिधित्व करने वाले नोड्स के साथ।

यदि आपको दस्तावेज़ से विशिष्ट जानकारी निकालने में मदद की ज़रूरत है, तो आपको यह स्पष्ट करना होगा कि आप कौन सी जानकारी प्राप्त करना चाहते हैं। उदाहरण के लिए, आप मेज से सभी लिंक लाने के लिए कैसे पूछ सकता है और फिर हम की तरह कुछ का जवाब दे:

$div = $dom->getElementById('showContent'); 
foreach ($div->getElementsByTagName('a') as $link) 
{ 
    echo $dom->saveXML($link); 
} 

लेकिन जब तक आप अधिक विशिष्ट हैं, हम केवल अनुमान लगा सकते हैं जो नोड्स प्रासंगिक हो सकता है।

आप और अधिक उदाहरण और डोम के साथ काम करने पर कोड के टुकड़े की जरूरत है संबंधित प्रश्नों के लिए अपने पिछले जवाब के माध्यम से ब्राउज़ हैं:

अब तक, हर के लिए एक टुकड़ा नहीं होनी चाहिए मूल से मध्यम उपयोग करें जो आपके पास डोम के साथ हो सकता है।

+2

धन्यवाद गॉर्डन, मुझे यह जानने के लिए कुछ ऐसा करने की ज़रूरत थी कि डोम कैसे काम करता था, लेकिन मैं ' मुझे नहीं लगता कि मैं इसे जिस जानकारी की आवश्यकता थी, उसे क्रॉल करने के लिए इसका उपयोग कर सकता हूं, क्योंकि वे किसी भी मानकों का पालन नहीं करते हैं और कक्षाएं, आईडी या ऐसा कुछ भी नहीं है, केवल टेबल :(जानकारी का उपयोग करने के तरीके को जानने के लिए वैसे भी उपयोगी था यह = डी – Saikios

+5

+1 ... मैं नोडविले के लिए मानचित्र ढूंढ रहा हूं सबसे लंबा समय! – rdlowrey

4

एक पार्सर बनाने के लिए आप htmlDOM का उपयोग कर सकते हैं।

PHP में लिखित डीओएम पार्सर का उपयोग करना बहुत आसान है। इसका उपयोग करके आप div टैग की सामग्री आसानी से प्राप्त कर सकते हैं।

उदाहरण के लिए, टैग खोजें जिनमें text के मान के साथ विशेषता है।

$ret = $html->find('div[id=text]'); 
+1

यह मेरे लिए एक बेहतर काम था। मैं ऐसी साइट के साथ काम कर रहा था जिसमें वास्तव में खराब एचटीएमएल था। domdocument मैं चाहता था नोड खोजने में सक्षम नहीं था। यह लाइब्रेरी खराब एचटीएमएल को बेहतर तरीके से संभालती है। – metric152

संबंधित मुद्दे