Использование простого HTML DOM для очистки?

Простой HTML DOM — это, по сути, php, который вы добавляете на свои страницы, что позволяет вам выполнять простой веб-скрейпинг. По большей части это хорошо, но я не могу разобраться в руководстве, так как я не большой программист. Есть ли какие-либо сайты/руководства, которые могут помочь в этом? (тот, что на php.net, на данный момент для меня слишком сложен) Есть ли лучшее место, чтобы задать такой вопрос?

Его сайт находится по адресу: http://simplehtmldom.sourceforge.net/manual.htm.

Я могу соскрести вещи, которые имеют определенные классы, такие как <tr class="group">, но не промежуточные. Например.. Это то, что я сейчас использую...

$url = 'http://www.test.com';
$html = file_get_html($url);
foreach($html->find('tr[class=group]') as $result)
  {
    $first = $result->find('td[class=category1]',0);
    $second = $result->find('td[class=category2]',0);
    echo $first.$second;
  }
}

Но вот код, который я пытаюсь очистить.

<table>
  <tr class="Group">
    <td>
      <dl class="Summary">
        <dt>Heading 1</dt>
          <dd><a href="#123" class="ViewProfile">Cat</a></dd>
          <dd><a href="#032" class="ViewProfile">Bacon</a></dd>
        <dt>Heading 2</dt>
          <dd><a href="#143" class="ViewProfile">Narwhal</a></dd>
          <dd><a href="#642" class="ViewProfile">Ice Soap</a></dd>
      </dl>
    </td>
  </tr>
</table>

Я пытаюсь извлечь содержимое каждого <dt> и поместить его в переменную. Затем я пытаюсь извлечь содержимое каждого <dd> и поместить его в переменную, но ничего из того, что я пробовал, не работает. Вот лучшее, что я смог найти, но оно многократно возвращает мне только первый заголовок, а не переходит ко второму.

foreach($html->find('tr[class=Summary]') as $result2)
  {
    echo $result2->find('dt',0)->innertext;
  }

Спасибо всем, кто может помочь. Извините, если это не ясно или что это так долго. В идеале я хотел бы иметь возможность лучше понимать эти команды DOM, поскольку я хотел бы понять это сам, а не кто-то здесь, просто сделать это (но я тоже был бы признателен).

TL;DR: я пытаюсь понять, как использовать команды, перечисленные в руководстве (ссылка выше). «Руководство» не достаточно просто. Как вы относитесь к изучению этого материала?


person Cully    schedule 28.10.2012    source источник
comment
Я очень сильно ненавижу Simple DOM. Адская смесь объектов и массивов, которую вы получите в ответ... адская. PHPQuery — это круто, но в итоге я перешел на Python и Beautiful Soup для такого типа задач.   -  person JAL    schedule 28.10.2012
comment
Да, в идеале я бы предпочел использовать Python, но тогда мне придется изучить что-то, что в конечном итоге станет для меня дополнительной работой. Я посмотрел на PHPQuery и не могу понять ни головы, ни хвоста. Я просто хочу, чтобы был простой способ научиться этим вещам... или даже если бы была книга или что-то, что я мог бы проработать.   -  person Cully    schedule 28.10.2012
comment
Просто мое предложение, потому что у меня была такая же проблема с обучением, и я пришел к выводу, что «Простой DOM» совсем не такой. Я считаю это действительно ужасным и искренне рекомендую искать любую другую возможную альтернативу.   -  person JAL    schedule 29.10.2012


Ответы (1)


Я думаю, что $result2->find('dt',0) возвращает вам элемент 0, который является первым. Если вы опустите это, вместо этого вы сможете получить массив (или nodelist). Что-то вроде этого:

foreach($html->find('tr[class=Summary]') as $result2)
{
    foreach ($result2->find('dt') as $node)
    {
       echo $node->innertext;
    }
}

Вам не нужен внешний цикл for, так как в вашем документе есть только 1 tr. Вы даже можете вообще оставить его, чтобы найти каждый dt в документе, но для таких инструментов, я думаю, хорошо быть одновременно гибким и строгим, чтобы вы были готовы к нескольким строкам, но не случайно анализировали dt из любого места. в документе.

person GolezTrol    schedule 28.10.2012
comment
Вау, спасибо! Оно перестало повторяться. Извините за сложный вопрос и спасибо за помощь. На самом деле в документе тонна тегов tr, но я вырезал большую их часть для простоты. Внешний тег просто сокращает его до того, что я показываю в этом примере. - person Cully; 28.10.2012