Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Объект класса domDocument для разбора кода html
 
 автор: mendosa49   (09.10.2013 в 12:02)   письмо автору
 
 

Здравствуйте.Появилась необходимость парсить html документ.Решил сделать это при помощи класса domDocument.Так как нигде в интернете это не разбиралось,решил попробовать.Но не получилось пока.Выводится только сообщение Array(), а надеялся получить текст. Вот код.Может кто подскажет? Замечания по ходу выполнения скрипта есть но ошибок не было.
<?php

    
/**
    * В этот массив мы будем записывать новости
    * Каждая новость будет элементом этого массива и будет содержать набор данных, таких как заголовок, текст и ссылка
    *
    * @var array
    */
    
$items = array();
    
/**
    * Это адрес сайта, мы записываем его с переменную $pageurl
    *
    * @var string
    */
    
$pageurl 'http://kinokota.ru/';
    
/**
    * Получаем полный html текст страницы и сохраняем в переменную $content
    *
    * @var string
    */
    
$content file_get_contents($pageurl);
    
/**
    *
    * http://php.net/manual/ru/class.domdocument.php
    *
    * Тут мы создаем объект класса domDocument
    * который мы будем использовать для разбора (парсинга) html кода
    *
    * @var domDocument
    */
    
$dom = new domDocument;
    
/**
    * И загружаем в него html код
    *
    * @var domDocument
    */
    
$dom->loadHTML($content);
    
$dom->preserveWhiteSpace false;
    
/**
    * По ID находим родительский элемент в котором хранятся все новости
    *
    * @var DOMElement
    */
    
$news $dom->getElementById('content-container');
    
/**
    * В цикле проходим по всем дочерним элементам
    *
    * Каждая новость представляет из себя блок вида <div id="post"> тут сама новость </div>
    */
    
foreach ($news->childNodes as $node) {
        
/**
        * Если дочерний элемент не div то пропускаем
        */
        
if ($node->tagName != 'div') {
            continue;
        }
        
/**
        * Если дочерний элемент не имеет атрибута id то пропускаем
        */
        
if (!$node->hasAttribute('id')) {
            continue;
        }
        
/**
        * Если атрибута id не равен post то пропускаем
        */
        
if ($node->getAttribute('id') != 'post') {
            continue;
        }
        
/**
        * Создаем пустой объект, который будет представлять собой новость
        * Мы будем сохранять параметры новости, такие как заголовок и текст,
        * в этом объекте
        *
        * @var stdClass
        */
        
$item = new stdClass();
        
/**
        
        *
        * Теперь будем проходить по внутренним элементам блока
        * чтобы получить параметры новости
        */
        
foreach ($node->childNodes as $param) {
            
/**
            * Все параметры хранятся в элементах div
            * Если дочерний элемент не div то пропускаем
            */
            
if ($param->tagName != 'div') {
                continue;
            }
            
/**
            * У всех параметров также есть атрибут class
            * Если дочерний элемент не имеет атрибута class то пропускаем
            */
            
if (!$param->hasAttribute('class')) {
                continue;
            }
            
/**
            * Получаем атрибут class параметра
            *
            * @var string
            */
            
$param_class = (string)$param->getAttribute('class');
            switch(
$param_class) {
                case 
'entry-meta':
                    
/**
                    * Это заголовок новости, нужно получить первую (и единственную)
                    * ссылку внутри заголовка, она содержит текст заголовка и адрес статьи
                    *
                    * @var DOMElement
                    */
                    
$link $param->getElementsByTagName('a')->item(0);
                    if (
$link) {
                        
/**
                        * Тексты и заголовки закодированны в UTF-8
                        */
                        
$item->title utf8_decode((string)$link->textContent);
                        
$item->link = (string)$link->getAttribute('href');
                    }
                    break;
                case 
'entry-content':
                    
/**
                    * Из этого блока мы може вытащить текст и картинку
                    */
                    /**
                    * Сначала находим и сохраняем картинку
                    *
                    * @var DOMElement
                    */
                    
$image $param->getElementsByTagName('img')->item(0);
                    if (
$image) {
                        
/**
                        * И берем ее аргумент src
                        */
                        
$item->image = (string)$image->getAttribute('src');
                    }
                    
/**
                    * Потом берем первый параграф, в котором содержание новости
                    */
                    
$p $param->getElementsByTagName('p')->item(0);
                    
/**
                    * Тексты и заголовки закодированны в UTF-8
                    */
                    
$item->content utf8_decode((string)$p->textContent);
                    break;
                case 
'entry-info':
                    
/**
                    * Здесь дата
                    *
                    * @var stdClass
                    */
                    
$item->date utf8_decode((string)$param->textContent);
                    break;
            }
        }
        
/**
        * Добавляем новость в массив если в ней есть заголовок, ссылку на статью и содержание
        * Таким образом фильтруем пустые блоки
        */
        
if (
            isset(
$item->title) &&
            isset(
$item->link) &&
            isset(
$item->content)
        ) {
            
$items[] = $item;
        }
    }
    
print_r($items);
  
?>    

  Ответить  
 
 автор: mihdan   (09.10.2013 в 16:26)   письмо автору
 
   для: mendosa49   (09.10.2013 в 12:02)
 

А не проще взять их RSS и разобрать?

  Ответить  
 
 автор: mendosa49   (10.10.2013 в 10:18)   письмо автору
 
   для: mihdan   (09.10.2013 в 16:26)
 

RSS разобрать проще конечно.Но зачем гнаться за простотой.решил использовать Класс DOMDocument

  Ответить  
 
 автор: ottawa1   (12.10.2013 в 21:22)   письмо автору
 
   для: mendosa49   (10.10.2013 в 10:18)
 

попробуй такой код.
<?php
$url 
'http://www.mysite.ru/';  // Url для парсинга
$start '<td id="news">';  // Выдираем кусок кода с откуда будет начинатся парс. 
$finish '</td>';           // И где заканчивается

$content file_get_contents($url);   //ну тут мы обрезаем лишнее
$position strpos($content$start);
$content substr($content$position);
$position strpos($content$finish);
$content substr($content0$position);
$content substr($content18);
// задаем кодировку и отображаем текст парса 
echo ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">$content"); 
// Записываем в базу полученные значения и проверяем записалось или нет. 
$db=mysql_connect("localhost","..........",".............");
mysql_select_db("ywbx");
//addslashes этим экранируем кавычки в тексте которые есть в переменной $content
$upd=mysql_query("UPDATE `grabbed_maxcim` SET online='".addslashes($content)."' WHERE url='http://www.mysite.ru'");
            if (
$upd == true){
                echo 
'  -  Удачно записано в базу';}
            else{
        echo 
'Ошибка'mysql_error();}
        
            unset(
$content); 
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования