2011-11-29 70 views
1

我想使用DOM從以下批獲得的日期和時間,並在房間(IM實際上得到在我的劇本的一切,但它獲得這些具有麻煩兩個IM)獲取數據HTML:PHP DOM解析器從跨度

    </td><td class="call"> 
        <span>12549<br/></span><a href="http://www.bkstr.com/webapp/wcs/stores/servlet/booklookServlet?bookstore_id-1=584&term_id-1=201190&crn-1=12549" target="_blank">View Book Info</a> 
        </td><td> 
        <span id="ctl10_gv_sectionTable_ctl03_lblDays">F:1000AM - 1125AM<br />T:230PM - 355PM</span> 


        </td><td class="room"> 
        <span id="ctl10_gv_sectionTable_ctl03_lblRoom">KUPF106<br />KUPF106</span> 
        </td><td class="status"><span id="ctl10_gv_sectionTable_ctl03_lblStatus" class="red">Closed</span></td><td class="max">20</td><td class="now">49</td><td class="instructor"> 
        <a href="https://directory.njit.edu/PersDetails.aspx?persid=SCHOENKA" target="_blank">Schoenebeck Kar</a> 
        </td><td class="credits">3.00</td> 

     </tr><tr class="sectionRow"> 
      <td class="section"> 
        101<br /> 

這裏是我迄今爲止尋找天

$tracker =0; 
    // DAYS AND TIMES 
    $number = 3; 
    $digit = "0"; 
    while($tracker<$numSections){   
     $strNum = strval($number); 
     $zero = strval($digit); 
     $start = "ctl10_gv_sectionTable_ctl"; 
     $end = "_lblDays"; 
     $id = $start.$zero.$strNum.$end; 
     //$days = $html->find('span.$id'); 
     $days=$html->getElementByTagName('span')->getElementById($id); 
      echo "Days : "; 
      echo $days[0] . '<br>'; 


     $tracker++; 
     $number++; 
     if($number >9){ 
      $digit = "1"; 
      $number=0; 
     } 
    } 

,你可以從HTML看到,該網站IM分析具有相當獨特的ID對一些跨度(ctl10_gv_sectionTable_ctl03_lblRoom) 。由於我只發佈了1個部分的HTML代碼塊,因此您沒有看到的是,除了「ctl03」部分外,下一個代碼段的代碼是相同的,這是我所有額外的代碼所處理的部分,一個被它拋棄。

我已經嘗試了幾種不同的方式,但似乎無法得到天(即「1000AM - 1125AM」)或房間(即KUPF106)。剩下的東西很容易抓取,但這兩個沒有類標識符,甚至沒有td標識符。我想我只需要知道如何使用我在$ id中的值作爲我正在尋找的特定跨度ID?如果有的話,有人可以告訴我該怎麼做?

回答

2

此:

$html->getElementByTagName('span')->getElementById($id); 

是沒有意義的。 getElementByTagName返回一個DOMList,它沒有getElementById方法。

我想你的意思是$html->getElementById($id);,但我無法確定,因爲我不知道$html是什麼。

一旦你的元素,你可以得到​​文本值,如果你不需要的文本節點之間行走。

你有沒有使用DOMXPath爲您解析任務考慮?這大概更容易和更清晰。

+0

我會避免關於DOMXPath的聲明變得更簡單,更不用說它更乾淨了。它更強大,但更容易?嗯...... – jolt

+0

是的,我認爲這條線不會做我想做的事情,這是最後一次嘗試得到它。 $ html是我需要的任何網站的HTML ...「\t $ html = file_get_html($ fp);」 是啊,我沒有看xpath一點,它似乎並不容易,但即時將嘗試您的建議,謝謝 – user1070764

+0

@湯姆,我認爲XPath是既簡單又清晰。使用DOM比getElementById更復雜。 –

0

除非您使用Php版本< = 4,否則應避免使用簡單的Html Dom。Php5中內置的Dom函數使用更可靠的libxml2庫。

迭代是HTML的正確方法是首先確定的行進行迭代,然後寫XPath表達式相對於該行的數據拉。

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

foreach($xpath->query("//tr[@class='sectionRow']") as $row){ 
    echo $xpath->query(".//span[contains(@id,'Days')]",$row)->item(0)->nodeValue."\n"; 
    echo $xpath->query(".//span[contains(@id,'Room')]",$row)->item(0)->nodeValue."\n"; 
    echo $xpath->query(".//span[contains(@id,'Status')]",$row)->item(0)->nodeValue."\n"; 
} 
+0

謝謝你..現在我只是想要這個工作,因爲它是一個更大的項目的一小部分,但我想要優化它,所以感謝這個例子。 – user1070764