PHP简单的HTML DOM解析器

问题描述:

我刚开始使用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

请尝试以下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

更简单的是从手动:

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