Главная > PHP, Программирование > Парсим RSS с помощью PHP

Парсим 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

Комментирование отключено.