2009-02-26 14 views
0

Kısa bir süre önce PHP'deki DOM modülünü okudum ve şimdi bir HTML belgesini ayrıştırmak için kullanmaya çalışıyorum. Sayfa, bunun preg kullanmanın çok daha iyi bir çözüm olduğunu söyledi ama nasıl kullanacağımı anlamakta zorlanıyorum.PHP DOM XPath ayrıştırma tablosunda yardıma ihtiyacınız var

Sayfada, tarihleri ​​içeren bir tablo ve tarih için X adet etkinlik var.

Önce metni (bir tarih) valign = "alt" ile bir tr'den almalıyım ve daha sonra, o tr altındaki valign = "top" ile tüm sütun değerlerini almam gerekiyor. Her bir tr'den sonraki tüm tril değerleri tr ile sonraki en son değere kadar tr = "alt" (sonraki tarih) ile tr. Sütun verileriyle tr sayısı bilinmiyor, sıfır veya çok olabilir.

Bu

sayfasındaki HTML göründüğünü gibi: İlk iki tarihleri ​​almak mümkün oldum Şimdiye kadar

<table> 
    <tr valign="bottom"> 
     <td colspan="4">2009-02-26</td> 
    </tr> 
    <tr valign="top"> 
     <td>21:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="top"> 
     <td>23:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="bottom"> 
     <td colspan="4">2009-02-27</td> 
    </tr> 
    <tr valign="top"> 
     <td>06:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="top"> 
     <td>10:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
    <tr valign="top"> 
     <td>13:00</td> 
     <td>Column data</td> 
     <td>Column data</td> 
     <td>Column data</td> 
    </tr> 
</table> 

(İlk iki ilgileniyorum sadece) ama buradan nasıl gideceğimi bilmiyorum.

Ben tarih TRS almak için kullandığınız xpath sorgusu

$result = $xpath->query('//tr[@valign="bottom"][position()<3]); 

Şimdi yani bugüne kadar o gün için tüm olayları bağlamak için bir yol gerekir olduğunu. tr Tüm tds ve sonraki sütun değerlerini bir sonraki tarihe kadar seçin tr.

cevap

0

following-sibling()'u kullanın. Tarih hücreleri ile belirlenen bir düğüm

+0

Teşekkürler, ancak xpath'e yalnızca [valign = "bottom"] ile bir düğüme kadar olan kardeşleri seçmesini nasıl söylersiniz? Aşağıdaki tarihte takip eden sibling :: tr [@ valign = "top"] kullanırsam, yalnızca bir sonraki tarihe kadar olanları beklediğimde aşağıdaki tüm tr'leri döndürürüm tr? –

+0

Geçerli tr [@ valign = "alt"] kardeşlerini takip eden tüm düğümleri seçin, ancak sonraki karenin kardeşlerini takip etmeyin. Örneğin, birincisi için: aşağıdaki -sibling :: tr [@ valign = "alt"] [1] ve değil (aşağıdaki-kardeşlik :: tr [@ valign = "alt"] [2]) – vartec

3
$oldSetting = libxml_use_internal_errors(true); 
libxml_clear_errors(); 

$html = new DOMDocument(); 
$html->loadHtmlFile('http://url/table.html'); 

$xpath = new DOMXPath($html); 
$elements = $xpath->query("//table/tr"); 

foreach ($elements as $item) { 
    $newDom = new DOMDocument; 
    $newDom->appendChild($newDom->importNode($item,true)); 

    $xpath = new DOMXPath($newDom); 

    foreach ($item->attributes as $attribute) { 

    for ($node = $item->firstChild; $node !== NULL; 
     $node = $node->nextSibling) { 
     if (($attribute->nodeName =='valign') && ($attribute->nodeValue=='top')) 
     { 
     print($node->nodeValue); 
     } 
     else 
     { 
     print("<br>".$node->nodeValue); 
     } 
    } 
    print("<br>"); 
    } 
} 

libxml_clear_errors(); 
libxml_use_internal_errors($oldSetting); 
0

Bu XPath ifadesi

/table/tr/td[@colspan=4] 

veya

/table/tr[valign='bottom']/td 

için sonuçlar.

İşaretler arasında hücreler nasıl alınır?

/table/tr/td[not(@colspan=4)][preceding::td[@colspan=4][1]='2009-02-26'] 
İlgili konular