Парсим RSS с помощью PHP
31 Май 2006
Итак тут многие порывались распарсить RSS-feed при помощи php но мало кому удавалось. Поэтому я предлагаю вот такой вариант скрипта…
Допустим у нас есть xml скрипт нашего канала новостей немного модифицированный для лучшего восприятия
<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>LDU Skins: News</title>
<link>http://www.ldu.izemi.ru</link>
<description>Русская редакция</description>
<generator>Land Down Under Copyright Neocrome http://www.neocrome.net</generator>
<pubdate>Wed, 31 May 2006 18:08:12 +0400</pubdate>
<category>LDU Skins: News</category><ttl>300</ttl><language>ru</language>
<item>
<title>Шпаргалки</title>
<description>В дополнение к шпаргалкам CSS сайт ILoveJackDaniels.com выпустил еще ряд шпор....</description>
<link>http://www.ldu.izemi.ru/index.php?m=single&id=32</link>
<pubdate>Wed, 26 Apr 2006 04:09:00 +0400</pubdate>
<comments>http://www.ldu.izemi.ru/comments.php?id=n32</comments>
</item>
<item>
<title>Seditio v.102</title>
<description>Доступна для загрузки новая Seditio v.102</description>
<link>http://www.ldu.izemi.ru/index.php?m=single&id=31</link>
<pubdate>Fri, 21 Apr 2006 04:56:00 +0400</pubdate>
<comments>http://www.ldu.izemi.ru/comments.php?id=n31</comments>
</item>
<item>
<title>Seditio v.100</title>
<description>Релиз Seditio v.100 - вышел!</description>
<link>http://www.ldu.izemi.ru/index.php?m=single&id=30</link>
<pubdate>Fri, 10 Mar 2006 10:29:00 +0300</pubdate>
<comments>http://www.ldu.izemi.ru/comments.php?id=n30</comments>
</item>
</channel>
</rss>
Ну, в примере я не буду тащить его из инета а положу в файлик с названием rss.xml
Теперь пишем вот такой забавный скрипт на php
// XML данные
$xml_file = "rss.xml";
// читаем XML файл
if (!($fp = fopen($xml_file, "r")))
{
die("File I/O error: $xml_file");
}
// строим переменную содержащую XML данные
$data = fread($fp, filesize($xml_file));
// инициализируем парсер
$xml_parser = xml_parser_create();
// выключаем пробельные символы
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
// читаем данные в масивы
if (!xml_parse_into_struct($xml_parser, $data, $elementArray, $frequencyArray))
{
die("XML parser error: " . xml_error_string(xml_get_error_code($xml_parser)));
}
// готово, очищаем буфер
xml_parser_free($xml_parser);
// строим массив содержащий ссылки
$urls = array();
// просматриваем массив $frequencyArray в поиске <url> элементов
// этот элемент сам по себе масив поэтому проходим по нему циклом
foreach($frequencyArray["LINK"] as $element)
{
// для каждого найденого значение смотрив массив $elementsArray и берем значение
// добавляем их в новый массив
$urls[] = $elementArray[$element]["value"];
}
// смотрим что получилось
print_r($urls);
а получилось вот что
Array (
[0] => http://www.ldu.izemi.ru
[1] => http://www.ldu.izemi.ru/index.php?m=single&id=32
[2] => http://www.ldu.izemi.ru/index.php?m=single&id=31
[3] => http://www.ldu.izemi.ru/index.php?m=single&id=30
)
значит мы выбрали все ссылки, также можно выбрать все названия и описания и положить их в БД…
например вот так
foreach($frequencyArray["TITLE"] as $element)
{
// для каждого найденого значение смотрив массив $elementsArray и берем значение
// добавляем их в новый массив
$titles[] = $elementArray[$element]["value"];
}
foreach($frequencyArray["DESCRIPTION"] as $element)
{
// для каждого найденого значение смотрив массив $elementsArray и берем значение
// добавляем их в новый массив
$descriptions[] = $elementArray[$element]["value"];
}
for ($i=0,j=count($titles);$i<$j,$i++)
{
$sql = sed_sql_query("INSERT INTO $db_pages (page_title,page_description,page_extra1) VALUES ('{$titles[$i]}', '{$descriptions[$i]}', '{$urls[$i]}')");
}
ну вобщем вы поняли как…
Те кто испытывают трудности с UTF-8 (потому что php хранит все внутрение данные именно в этой кодировке) делают вот так
function UTF8toCP1251($str){
static $table = array("xD0x81" => "xA8", // Ё
"xD1x91" => "xB8", // ё
);
return preg_replace('#([xD0-xD1])([x80-xBF])#se',
'isset($table["$0"]) ? $table["$0"] :
chr(ord("$2")+("$1" == "xD0" ? 0x30 : 0x70))',
$str
);
}
foreach($frequencyArray["DESCRIPTION"] as $element)
{
// для каждого найденого значение смотрив массив $elementsArray и берем значение
// добавляем их в новый массив
$descriptions[] = UTF8toCP1251($elementArray[$element]["value"]);
}
На этом все, до новых встречь
PS по материалам книги "XML and PHP" автора Vikram Vaswani, New Riders Publishing
Categories: PHP, Программирование
Свежие комментарии