|
|
|
| Здравствуйте.Появилась необходимость парсить 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);
?>
|
| |
|
|
|
|
|
|
|
для: mendosa49
(09.10.2013 в 12:02)
| | А не проще взять их RSS и разобрать? | |
|
|
|
|
|
|
|
для: mihdan
(09.10.2013 в 16:26)
| | RSS разобрать проще конечно.Но зачем гнаться за простотой.решил использовать Класс DOMDocument | |
|
|
|
|
|
|
|
для: 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($content, 0, $position);
$content = substr($content, 18);
// задаем кодировку и отображаем текст парса
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);
?>
|
| |
|
|
|