2011-01-26 125 views
2

我剛開始使用PHP Simple HTML DOM ParserPHP簡單的HTML DOM解析器

現在我試圖從一個現存的HTML文檔中提取包含<b> -tag inctauing </b>的所有元素。這正常工作與

foreach($html->find('b') as $q) 
    echo $q; 

我怎樣才能做到露面只與<b></b>標籤都有效接着是<span class="marked">包圍元素?

更新: 我用firebug來獲取元素的css路徑。現在看起來像這樣:

foreach ($html->find('html body div#wrapper table.desc tbody tr td div span.marked') as $x) 
    foreach ($x->find('html body div#wrapper table.desc tbody tr td table.split tbody tr td b') as $d) 
     echo $d; 

但它不會工作...任何想法?

更新:

在此澄清,我的問題文件的樣本TR與開始表和結束表標籤。

<table width="100%" border="0" cellspacing="0" cellpadding="0" class="desc"> 
    <tr> 
     <th width="25%" scope="col"><div align="center">1</div></th> 
     <th width="50" scope="col"><div align="center">2</div></th> 
     <th width="10%" scope="col"><div align="center">3</div></th> 
     <th width="15%" scope="col"><div align="center">4</div></th> 
    </tr> 
    <tr> 
     <td valign="top" bgcolor="#E9E9E9"><div style="text-align: center; font-weight: bold; margin-top: 2px"> 1 </div></td> 
     <td> 
      <table width="100%" border="0" cellspacing="0" cellpadding="0" class="split"> <tr> 
        <td> 
         <b> element to extract</b></td> 
       </tr> 
       <tr> 
        <td> 
         <table width="100%" border="0" cellspacing="0" cellpadding="0" class="split"> <tr> 
           <td width="15px" valign="top">&nbsp;</td> 
           <td width="15px" valign="top"> 
            <div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px"> 
             1 
            </div> 
           </td> 
           <td> 
            abed 
           </td> 
          </tr> 
          <tr> 
           <td width="15px" valign="top">&nbsp;</td> 
           <td width="15px" valign="top"> 
            <div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px"> 
             2 
            </div> 
           </td> 
           <td> 
            ddee 
           </td> 
          </tr> 
          <tr> 
           <td width="15px" valign="top">&nbsp;</td> 
           <td width="15px" valign="top"> 
            <div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px"> 
             3 
            </div> 
           </td> 
           <td> 
            xdef 
           </td> 
          </tr> 
          <tr> 
           <td width="15px" valign="top">&nbsp;</td> 
           <td width="15px" valign="top"> 
            <div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px"> 
             4 
            </div> 
           </td> 
           <td> 
            abbcc 
           </td> 
          </tr> 
          <tr> 
           <td width="15px" valign="top">&nbsp;</td> 
           <td width="15px" valign="top"> 
            <div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px"> 
             5 
            </div> 
           </td> 
           <td> 
            ab 
           </td> 
          </tr> 
          <tr> 
           <td width="15px" valign="top">&nbsp;</td> 
           <td width="15px" valign="top"> 
            <div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px"> 
             6 
            </div> 
           </td> 
           <td> 
            e1 
           </td> 
          </tr> 
         </table> 
        </td> 
       </tr> 
      </table> 
     </td> 
     <td valign="top"><div style="text-align: center"> <span class="marked">marked</span> </div></td> 
     <td valign="top"><div style="text-align: center"> </div></td> 
    </tr> 
</table> 
+0

你的意思``或``? – 2011-01-27 08:12:45

回答

3

請嘗試以下CSS selector

b > span.marked 

這將返回雖然跨度,所以你可能需要做$e->parent()去B元素。

另見Best Methods to parse HTML用於替代SimpleHtmlDom

更新後

編輯:

Your browser will modify the DOMIf you look at your markup,你會看到沒有tbody元素。然而,螢火蟲給你

html body div#wrapper table.desc tbody tr td div span.marked' 
html body div#wrapper table.desc tbody tr td table.split tbody tr td b' 

此外,您的問題不符合查詢。你問我如何找到與<b>,</b>標籤都有效,隨後包圍的<span class="marked">

可以讀取要麼意味着

<b><span class="marked">foo</span></b> 

<b><element>foo</element></b><span class="marked">foo</span> 

元素首先使用child combinator我之前已經展示過。對於第二個,使用adjacent sibling combinator

b + span.marked 

得到的跨度,然後使用$e->prev_sibling()返回元素的前一個兄弟(或空,如果沒有找到)。

但是,在你顯示的標記中,既沒有也沒有。只有一個DIV與具有顯着的一類孩子SPAN

<div style="text-align: center"> <span class="marked">marked</span> 

如果是要匹配的東西,它的再次子組合子。當然,你必須將b改爲div。

+0

沒錯。您可以使用HTML DOM解析器的CSS選擇器。 – Eray 2011-01-26 14:08:15

+0

@Eray我不知道SimpleHtmlDom實現它們的級別。和tbh,我不明白爲什麼我會需要他們(或SimpleHtmlDom),當我可以使用DOM和XPath :) – Gordon 2011-01-26 14:10:02

-1

更簡單的是從手動:

foreach($html->find('b') as $q) 
    echo $q->plaintext;