解析rss提要并更新/插入/删除行

时间:2010-10-08 13:07:25

标签: php mysql parsing

我正在尝试解析多个RSS源,如果它们发生了变化,那么就在我的MySQL表中更新我的记录。

目前,我有一个插入RSS Feeds项目的脚本(只需在表单中的url中发布并提交)。这会在我的表中插入以下内容: title,rss_url,description,price,discount,total

这一切都运作良好。

下一部分是一个脚本,如果它们在RSS中发生变化,则会更新行,但唯一的变化是价格或折扣更新。这也很棒

我还希望做的是: 如果删除了RSS源中的项目,那么我的脚本需要检测到这一点并删除该行或在我的表中插入一个标志,说它已被删除...

我的代码很冗长:

$result = mysql_query("SELECT * from easy_contents");
while($row = mysql_fetch_array($result))
{

$articles = array();
$easy_url = $row['rss_url'];

$rawFeed = file_get_contents($easy_url);
$xml = new SimpleXmlElement($rawFeed);


$channel = array();
$channel['title']       = $xml->channel->title;
$channel['link']        = $xml->channel->link;
$channel['description'] = $xml->channel->description;


foreach ($xml->channel->item as $item)
{
$article = array();
$article['title'] = $item->title;
$article['link'] = $item->link;
$article['description'] = (string) trim($item->description);

//strip out all the HTML tags
$item->description = str_replace('<table><tr><td width="110">','', $item->description);
$item->description = str_replace('</table>','', $item->description);
$item->description = str_replace('</td>','', $item->description);
$item->description = str_replace('<td>','', $item->description);
$item->description = str_replace('<br />','', $item->description);
$item->description = str_replace('<b>','', $item->description);
$item->description = str_replace('</b>','', $item->description);
$item->description = str_replace('</tr>','', $item->description);

//find all url encoded £ signs and find the string after
//string will be a price
preg_match_all('/&#xA3;([0-9.]+)/', $item->description, $results);
foreach ($results as $k => $v) {
}

//find the url encoded £ sign and append the price
$all = '&#xA3;'.$v[0];
$price_stripped = str_replace($all, '', $item->description);
$desc = preg_match('/&#xA3;([0-9.]+)/', $item->description);

//find the discount deleviry cost from the rss using the ~#&pound;NUMBER
//this is the discount
preg_match_all('/~#&pound;([0-9.]+)/', $item->description, $discount);
foreach ($discount as $d => $disc) {
str_replace("~#&pound;","", $disc[0]);
}

//find the remaining £PRICE and this is the delivery cost
//this is the delivery_cost
preg_match_all('/&pound;([0-9.]+)/', $item->description, $delivery_cost);
foreach ($delivery_cost as $del => $deliv) { 
}

 //find the | char and find the string after it
//this is the retailer_message
preg_match_all('/\|(.*?)\./',$item->description,$match);           
foreach ($match as $rel => $retail) { 
$retail[0] = str_replace("| ","", $retail[0]);
$retail_mess = str_replace(" On","On", $retail[0]);

 }   

 $total = $v[0] + $deliv[0] - $disc[0];

 $sql = "UPDATE easy_contents SET delivery_cost = '$deliv[0]', price = '$v[0]', total = '$total' WHERE rss_url = '$row[rss_url]' AND title = '$item->title' AND description = '$price_stripped' ";
 if(!$query = mysql_query($sql)) {
     echo "Error on line ".__LINE__.". ".mysql_error().".<br />\nQuery: ";
     exit;
 }
 echo "Query OK. <br />\nUpdated rows: ".mysql_affected_rows().".<br />\nQuery: ";
   }   
  }

这将根据rss项目是否更改来更新数据库中的行。

任何人都可以提供一个片段,告诉我如何检测rss中的项是否被删除,还有php / mysql然后从我的表中删除这样的行?

谢谢

1 个答案:

答案 0 :(得分:0)

如果只是用RSS源中的新数据替换您的数据对您不起作用,您可以执行以下几个步骤:

  1. 从DB查询所有内容。使用ID
  2. 解析为数组
  3. 将RSS解析为带ID的数组。
  4. 比较数组。区别在于要从数据库中删除的ID。
  5. 循环差异数组并删除。
  6. 我在我写的应用程序上做了类似的事情。这是一个很长的解决方案,但是一旦你得到了错误,它就能很好地发挥作用。