2010-02-26 11 views
6

मैं PHP सरल HTML डोम पार्सर उपयोग कर रहा हूँ एक webshop (भी PHP5.3.0 साथ XAMPP 1.7.2 चल) के कुछ स्क्रैप डेटा, और मैं <tbody> टैग के साथ समस्याओं में चल रहा हूँ । तालिका की संरचना, है essentialy (विवरण वास्तव में है कि महत्वपूर्ण नहीं हैं):<tbody> गड़बड़

<table> 
    <thead> 
    <!--text here--> 
    </thead> 
    <tbody> 
    <!--text here--> 
    </tbody> 
</table> 

अब, मैं कोड का उपयोग करके <tbody> अनुभाग को पाने के लिए कोशिश कर रहा हूँ:

$element = $html->find('tbody',0)->innertext; 

यह नहीं करता है किसी भी त्रुटि को फेंक नहीं देते, जब मैं इसे गूंजने की कोशिश करता हूं तो यह कुछ भी प्रिंट नहीं करता है। मैंने अन्य तत्वों, <thead>, <table> पर कोड का परीक्षण किया है, यहां तक ​​कि <span class="price"> जैसे कुछ और वे सब ठीक काम करते हैं (कार्स, हटाने ", 0" कोड विफल रहता है)। वे सभी अपने सही खंड देते हैं। Outertext ditto। लेकिन यह सब <tbody> पर विफल रहता है।

अब, मैंने पार्सर के माध्यम से स्किम किया है, लेकिन मुझे यकीन नहीं है कि मैं इसे समझ सकता हूं। मैंने देखा है कि <thead> का भी उल्लेख नहीं किया गया है, लेकिन यह ठीक काम करता है। शग

मुझे लगता है कि मैं बच्चे नेविगेशन को आजमा सकता हूं और कर सकता हूं, लेकिन ऐसा लगता है कि यह भी गड़बड़ कर रहा है। मैंने अभी दौड़ने की कोशिश की है:

$el = $html->find('table',0); 
$el2 = $el->children(2); 
echo $el2->outertext; 

और कोई पासा नहीं। children को first_child और 2 के साथ 2 के साथ बदलने की कोशिश की, और अभी भी कोई पासा नहीं है। मजेदार, हालांकि, अगर मैं children के बजाय ->find का प्रयास करता हूं, तो यह पूरी तरह से काम करता है।

मुझे पूरा भरोसा है कि मैं पूरी चीज के आसपास काम ढूंढ सकता हूं, लेकिन यह व्यवहार यहां पोस्ट करने के लिए काफी अजीब लगता है। मेरा उत्सुक मन सभी मदद के लिए खुश है।

उत्तर

1

सुनिश्चित करें कि आपका tbody कुछ जावास्क्रिप्ट निष्पादन से आ रहा है। मुझे एक स्पैन टैग के साथ एक ही समस्या का सामना करना पड़ रहा था। बाद में मैंने पाया कि, यदि कोई HTML कोड jquery/किसी अन्य जावास्क्रिप्ट निष्पादन के माध्यम से पृष्ठ में हो रहा है तो उस स्थिति में simple_html_dom बस विफल हो जाता है।

24
simple_html_dom.php फ़ाइल टिप्पणी में

या हटाने लाइन # 396

// if ($m[1]==='tbody') continue; 
+1

एफवाईआई: संस्करण '1.11' (रेव। 184) में यह कोड लाइन '629' है। – h2ooooooo

+0

यह दस्तावेज में उल्लिखित होना चाहिए '>: (' –

+2

संस्करण 1.5 (संशोधन 1 9 6) में कोड लाइन 695 –

1

सुनिश्चित करें कि tbody वास्तव में है नहीं है। कई ब्राउज़र इंस्पेक्ट पैनल में टेबल पर एक टैब जोड़ देंगे, भले ही वे प्रतिक्रिया में मौजूद न हों। http://sourceforge.net/p/simplehtmldom/bugs/79/

यह अभी भी इस लेखन के समय पर खुला है:

2

इस मुद्दे यहाँ एक बग रिपोर्ट नहीं है। वहाँ एक विकल्प के ठीक आप एक पाश में उदाहरण के लिए, स्रोत कोड को संशोधित करने के <tr> लगाने के लिए इच्छा नहीं है अगर है

<?php 
    // The *BROKEN* way to find the <tr>'s 
    // below the <tbody> below the <table id="foo"> 
    foreach($dom->find('tbl#foo tbody tr') as $tr) { 
    /* you will get nothing */ 
    } 

आप के बजाय चुनिंदा पैरेंट टैग नाम की जांच कर सकते हैं, जबकि पुनरावृत्ति सभी<tr> की है जैसे इतना:

<?php 
    // A workaround to find the <tr>'s 
    // below the <tbody> below the <table id="foo"> 
    foreach($dom->find('tbl#foo tr') as $tr) { // note the lack of tbody selector 
    /* you will get all trs, but let's only work with ones with the parent 
     of a tbody! */ 
    if($tr->parent->tag == 'tbody') { // our workaround 
     /* this part will work as you would expect the above broken code to work */ 
    } 
    } 

यह भी ध्यान रखें, एक थोड़ा असंबंधित मुद्दा यह है कि मैं में भाग गया, कि क्रोम और एफएफ निरीक्षकों <tbody> और <thead> के बारे में टैग सूप सही कर देंगे।सावधान रहें - केवल वास्तविक स्रोत को देखें - यदि आप अस्पष्ट मुद्दों में भाग लेते हैं तो डीओएम निरीक्षकों से दूर रहें।

+0

आपने सहेजा मेरी रात आदमी। मुझे नहीं पता कि आप कोई हिट क्यों नहीं लेते हैं लेकिन बदले में सहायक फ़ाइल के बिना, आपका समाधान सबसे अच्छा है। धन्यवाद। –

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