PHP简单的HTML DOM解析器

时间:2011-01-26 14:02:20

标签: php html dom

我刚开始使用PHP Simple HTML DOM Parser

现在,我正在尝试从现有的HTML文档中提取包含<b>标记的所有元素,其中包含</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>

2 个答案:

答案 0 :(得分: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元素。然而Firebug给你

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

获取span,然后使用$e->prev_sibling()返回元素的前一个兄弟(如果未找到则返回null)。

但是,在你显示的标记中,既没有也没有。只有一个带有SPAN孩子的DIV具有标记的类

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

如果这是您想要匹配的内容,那么它又是子组合子。当然,你必须将b更改为div。

答案 1 :(得分:-1)

更简单的是手册:

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