PHP Простой HTML DOM Parser - PullRequest
       0

PHP Простой HTML DOM Parser

2 голосов
/ 26 января 2011

Я только начал использовать PHP Simple HTML DOM Parser .

Теперь я пытаюсь извлечь все элементы, окруженные тегом <b>, включая </b>, из существующегоHTML документ.Это прекрасно работает с

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

Как мне добиться, чтобы отображались только элементы, окруженные тегами <b>, </b>, а затем <span class="marked">?

Обновление: IЯ использовал 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;

Но это не сработает ... Есть идеи?

Обновление:

Чтобы прояснить мой вопрос, здесь приведен примердокумент с тегами начальной и конечной таблиц.

<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 ]

3 голосов
/ 26 января 2011

Попробуйте следующее Селектор CSS

b > span.marked

Это бы вернуло интервал, поэтому вам, вероятно, придется сделать $e->parent(), чтобы добраться до элемента b.

Также см. Лучшие методы для анализа HTML для альтернатив SimpleHtmlDom


Изменить после обновления:

Ваш браузер изменит DOM . Если вы посмотрите на свою разметку , вы увидите, что элементов 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>

Для этого сначала используйте дочерний комбинатор , который я показал ранее. Для второго используйте соседний братский комбинатор

b + span.marked

, чтобы получить диапазон, а затем используйте $e->prev_sibling(), чтобы вернуть предыдущего родственного элемента (или ноль, если не найден).

Однако в показанной вами разметке нет ни того, ни другого. Существует только DIV с ребенком SPAN, имеющим отмеченный класс

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

Если это то, что вы хотите сопоставить, это снова дочерний комбинатор. Конечно, вы должны изменить b тогда на div.

0 голосов
/ 20 февраля 2012

Более просто из руководства:

foreach($html->find('b') as $q)
    echo $q->plaintext;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...