2010-09-18 5 views
1

Я здание основного экрана скребок для личного использования и обучения целей, поэтому, пожалуйста, не пишите комментарии, как «Вы должны спросить разрешение» и т.д.Доступ к ребенку дивы с помощью DOMDocument и XPath

данных Я пытается получить доступ структурирована следующим образом:

<tr> 
    <td> 
     <div class="wrapper"> 
      <div class="randomDiv"> 
       <div class="divContent"> 
        <div class="event">asd</div> 
        <div class="date">asd</div> 
        <div class="venue">asd</div> 
        <div class="state">asd</div> 
       </div> 
      </div> 
     </div> 
    </td> 
</tr> 

Я пытаюсь собрать все эти данные (как есть около 20 строк на данной странице).

Используя следующий код я сумел собрать данные мне нужно:

$remote = file_get_contents("linktoURL"); 

$doc = new DOMDocument(); 
$doc->preserveWhiteSpace = false; 
$file = @$doc->loadHTML($remote); 
$rows = $doc->getElementsByTagName('tr'); 
$xp = new DOMXpath($doc); 

//initialize variables 
$rows = array(); 

foreach($xp->query('//*[contains(@class, \'wrapper\')]', $doc) as $found) { 
    echo "<pre>"; 
    print_r($found->nodeValue); 
} 

Теперь мой вопрос, как бы я идти о хранении все эти данные в виде ассоциативного массива, как показано ниже:

Array (
    [0] => Array 
     (
      [Event] => Name 
      [Date] => 12/12/12 
      [Venue] => NameOfPlace 
      [state] => state 
     ) 

    [1] => Array 
     (
      [Event] => Name 
      [Date] => 12/12/12 
      [Venue] => NameOfPlace 
      [state] => state 
     ) 

    [2] => Array 
     (
      [Event] => Name 
      [Date] => 12/12/12 
      [Venue] => NameOfPlace 
      [state] => state 
     ) 

) 

Прямо сейчас единственным решением, которое приходит на ум, является вызов запроса xpath для каждого имени класса //*[contains(@class, \'className\')] в цикле foreach.

Есть ли более идиоматический путь через DOMDocument и XPath, где я могу создать ассоциативный массив вышеуказанных данных?

редактировать:

Я не ограничивается использованием DOMDocument и XPath, если есть и другие решения, которые могли бы быть проще, то оставьте их.

+0

Существует библиотека, которая позволяет выбирать узлы с селекторов стилей CSS. Сейчас я не помню его имени. – alex

ответ

0

Вы можете импортировать некоторые функции в DOMXPath, зарегистрировав функции PHP, но AFAIK вы ограничены возвратом скаляров или узлов.

Вы можете преобразовать его с помощью простой таблицы стилей, используя XSLTProcessor::transformToDoc(), возможно экспортируя его в SimpleXML для упрощения доступа. Вопрос в том, будет ли он быстрее, чем поиск вручную.

Вы можете, конечно, сокращали использование XPath с помощью //div[contains(@class, 'event') or contains(@class, 'date')] и т.д.

+0

Спасибо за информацию. У меня не было много времени для работы над этим, надеюсь, сегодня вечером это изменится =) –

Смежные вопросы