Конвертировать RSS в CSV с PHP - PullRequest
0 голосов
/ 22 декабря 2011

Я работаю над преобразованием RSS-канала из старой корзины покупок в новую.Новая корзина будет принимать CSV в качестве входных данных.Я думаю, что обычно я мог бы поработать с этим и, возможно, разобраться с этим - но есть некоторые дополнительные задачи, которые необходимо выполнить с подачей, прежде чем она будет помещена в CSV.

Во-первых, вот необработанный канал http://www.bellyscarf.com/rsscategoryproducts.sc?categoryId=6

На самом деле мне не нужно слишком много данных из RSS, но вот что мне нужно (от каждого это моиполя '):

  • название
  • описание *
  • цена
  • цена продажи

* Описаниегде мне нужна работа.Он содержит несколько специальных символов html и html, которые я хотел бы удалить (включая ссылки на изображения).Простой текст - это то, что я ищу, проще говоря.

Как правило, поля добавляются после создания файла CSV?Я не против добавить их потом.Я буду работать с CSV в Excel, прежде чем он все равно будет запущен, добавив дополнительные поля и информацию.

Вот код, который я написал для анализа XML / RSS:

$ch = curl_init('http://bellyscarf.com/rsscategoryproducts.sc?categoryId=6');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

if(isset($doc->channel))
{
    parseRSS($doc);
} else {
    echo "Not RSS";
}

function parseRSS($xml)
{
    echo "<strong>".$xml->channel->title."</strong>";
    $cnt = count($xml->channel->item);
    for($i=0; $i<$cnt; $i++)
    {
        $url = $xml->channel->item[$i]->link;
        $title = $xml->channel->item[$i]->title;
        $desc = html_entity_decode($xml->channel->item[$i]->description);

        echo '<a href="'.$url.'">'.$title.'</a>'.$desc.'';
    }
}

YouЗдесь можно увидеть его результаты (не уверен, что это поможет): http://bestsox.com/zumba.php

Так как я могу сгенерировать файл CSV с этими данными?

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Алекс уже показал, как вы можете использовать fputcsv для создания файла CSV, но у вас все еще есть проблемы с чтением из канала.

Прежде всего, вы можете более непосредственно выполнять итерации по элементам канала., поэтому проще написать свой скрипт:

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

foreach($doc->channel->item as $item)
{
    $link = $item->link;
    $title = $item->title;
}

Чтобы получить ценник, вам нужно получить доступ к дочернему элементу другого пространства имен.Пространство имен определено в файле RSS, и вам необходимо знать его URI.Для gd: это:

http://app.fastshoppingcart.com/rss/featuredProduct/1.0

Затем вы можете получить доступ к цене, как в следующем расширенном примере:

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

foreach($doc->channel->item as $item)
{
    $link = $item->link;
    $title = $item->title;

    $gd = $item->children('http://app.fastshoppingcart.com/rss/featuredProduct/1.0');
    $price = $gd->price;
}

Теперь вы написали, что хотите удалить теги изполе описания.Это не очень хороший код, но он быстро выполняет свою работу:

$description = strip_tags(html_entity_decode($item->description));
$description = str_replace(array("\xA0", "\r", "\n", "\t", "\l", "\f"), ' ', $description);
$description = preg_replace('/\s{2,}/', ' ', $description);

Он использует strip_tags для удаления всех тегов, а затем пробелы нормализуются с помощью str_replace и preg_replace.

Надеюсь, это полезно.

1 голос
/ 22 декабря 2011

Вы можете использовать функцию fputcsv для записи файла CSV.Замените вашу parseRSS функцию следующим образом:

function parseRSS($xml)
{
        $fp = fopen('file.csv', 'w');
        $header = array('URL','Title','Description');
        fputcsv($fp,$header);
        $cnt = count($xml->channel->item);
        for($i=0; $i<$cnt; $i++)
        {
            $url = $xml->channel->item[$i]->link;
            $title = $xml->channel->item[$i]->title;
            $desc = html_entity_decode($xml->channel->item[$i]->description);
            $fields = array($url, $title, $desc);
            fputcsv($fp, fields);
        }

        fclose($fp);
}
...