2012-07-04 2 views
0

Прежде всего, я видел много подобных вопросов. Я знаю, что можно использовать регулярное выражение или dom, но я не могу найти хороших примеров DOM, и регулярное выражение заставляет меня тянуть мои волосы. Кроме того, мне нужно вытащить несколько значений из источника html, некоторые просто содержимое, некоторые атрибуты.Извлечь информацию из html?

Вот пример HTML мне нужно, чтобы получить информацию от:

<div class="log"> 
    <div class="message"> 
     <abbr class="dt" title="time string"> 
      DATA_1 
     </abbr> 
     : 
     <cite class="user"> 
      <a class="tel" href="tel:+xxxx"> 
       <abbr class="fn" title="DATA_2"> 
        Me 
       </abbr> 
      </a> 
     </cite> 
     : 
     <q> 
      DATA_3 
     </q> 
    </div> 
</div> 

Блок «сообщение» может произойти один раз или сотни раз. Я пытаюсь закончить с данными, как это:

array(4) { 
    [0] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
    [1] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
    [2] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
    [3] => array(3) { 
       ["time"] => "DATA_1" 
       ["name"] => "DATA_2" 
       ["message"] => "DATA_3" 
      } 
} 

Я попытался с помощью SimpleXML, но это только кажется работать на очень простую HTML-страницах. Может ли кто-нибудь связать меня с некоторыми примерами? Я очень запутался, так как мне нужно получить DATA_2 из атрибута title. Как вы думаете, лучший способ извлечь его данные? Это похоже на извлечение XML, которое я сделал, но мне нужно использовать какой-то другой метод.

+0

Каков адрес, из которого вы извлекаете? –

+0

Вы смотрите на функции DOM? http://php.net/manual/en/book.dom.php – Robbie

+0

Другой хорошей библиотекой для извлечения данных является phpQuery, поскольку она работает в аналогичной фракции с jQuery, которую вы уже используете для сканирования веб-страниц. – scottheckel

ответ

2

Ниже приведен пример использования DOMDocument и DOMXpath, чтобы проанализировать ваш HTML.

$doc = new DOMDocument; 
$doc->loadHTMLFile('your_file.html'); 
$xpath = new DOMXpath($doc); 

$res = array(); 

foreach ($xpath->query('//div[@class="message"]') as $elem) { 
    $res[] = array(
     'time' => $xpath->query('abbr[@class="dt"]', $elem)->item(0)->nodeValue, 
     'name' => $xpath->query('cite/a/abbr[@class="fn"]', $elem)->item(0)->getAttribute('title'), 
     'message' => $xpath->query('q', $elem)->item(0)->nodeValue, 
    ); 
} 
+0

Wow ... Впечатляет. Хотя есть одна небольшая проблема, она остается на элементе 0, и я не знаю, почему. Я также не знаю, как работает DOM. Я пытался сделать что-то с нуля, просматривая документацию о простохтмльдоме, но вы просто спасли мне кучу времени! –

+0

'$ xpath-> query()' всегда возвращает список элементов, поэтому мы обычно извлекаем элементы в цикле или просто 'item (0)', 'item (1)', 'item (2)' и т. Д. Поскольку мы знаем, что существует только один ' ...', мы можем получить его с помощью 'item (0)'. – flowfree

+0

Хммм ... Я тестировал его, и я получаю одно и то же снова и снова ... –

0

Можно ли использовать xPath? Это кажется идеальным кандидатом на то, что вы хотите сделать (но я могу неверно истолковать то, что вы просите).

XPath позволит вам выбрать определенные узлы дерева XML/HTML, а затем вы можете работать с ними оттуда. После этого, это должно быть простой задачей (или небольшим количеством простого регулярного выражения больше). Лично я люблю регулярное выражение, поэтому дайте мне знать, если вам нужна помощь в этом).

Ваших заявлений XPath будет выглядеть примерно так (не предполагающая никаких противоречивых имен):

время (данные 1):

/div/div/abbr/text() 

имя (данные 2):

/div/div/cite/a/abbr/@title 

сообщения (данные 3):

/div/div/q/text() 

Вы можете получить больше технологий, чем это, если, например, если вы хотите идентифицировать элементы через свои атрибуты, но то, что я вам дал, будет довольно быстрым.

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