【问题标题】:<![CDATA in SimplePie<![SimplePie 中的 CDATA
【发布时间】:2012-07-19 21:01:45
【问题描述】:

我一直在研究一些 RSS scraper,它可以解析来自多个来源的数据。也就是说,所有这些来源都有自己的 RSS 描述实现。

特别是,使用CDATA标签在like上写描述,例如

<![CDATA[
<p align=justify><font face="verdana, arial, helvetica, sans-serif" size=1>
<font color=#004080></font>
SOME TEXT GOES HERE 
 </font></p>
]]>

但是,如果我尝试使用 SimplePie 获取项目描述,我会得到此输出

<div><p align="justify"></p></div>

我正在使用这个 php 脚本来做这一切

 foreach($feed->get_Items() as $item)
 {
        
        $title = $item->get_title();
         $description = $item->get_description();
        //some other stuff
 }

现在是好的部分

feed上的title也是这样来的

<title>
  <![CDATA[ 
     Nice title
  ]]>
</title>

而且...它有效!!!

如何获取提要的说明?我几乎尝试了所有方法!

谢谢!

【问题讨论】:

  • 您可能想file a bug-report with SimplePie。如果您这样做,请链接/附加原始提要,以便更好地复制。
  • 所以,我偶然发现了一个错误?!该死的:(那我会提交报告。
  • 好吧,如果它不能按预期工作,我会说这是一个错误(或缺陷)。根据您发布的内容,我会说它至少应该有文字,但它是空的。错误是正常的:我们共享代码,我们共享错误。需要你的帮助!请写一个很好的错误报告,展示如何重现和提供所有数据(不仅是 URL,还有真实数据)。谢谢!

标签: php cdata simplepie


【解决方案1】:

get_description()get_content() 方法都对原始数据执行sanitation,但您可以使用get_item_tags() 方法将其原样提取,如下所示:

$desc_tags = ($item->get_item_tags('', 'description')); // empty namespace is RSS2.0
if ($desc_tags) {
    print $desc_tags[0]['data'];
}

唯一需要注意的是,当get_contentget_description 将尝试检测命名空间时,您必须将其提供给get_item_tags,您可以看到namespace constants here。如果您事先知道提要格式,那应该没有问题,否则您可能需要像get_description 那样反复试验。

【讨论】:

  • 为什么它实际上会破坏东西时称为卫生?
  • 谢谢!!!由于其“精致”的性质,我实际上正在解析这个提要与其他提要。所以,由于这个提要仍然是 RSS2(我认为),而且这个代码只会干扰它,我发现这个解决方案是可以接受的!非常感谢!!!
  • 我不确定,但您运行的版本可能与最新版本不同,我已将示例描述转储到文件中,结果对我来说是 &lt;p align="justify"&gt;SOME TEXT GOES HERE &lt;/p&gt;(省略了一堆空格) 字体标签仍然被杀死。它使用 PHP DOM 扩展,因此也可能是 php 版本差异。
  • 奇怪...我使用的是从网站下载的最新版本。即使使用 PHPDOM,结果也是一样的......
  • @hakre 抱歉,这是一个错误!这样做的目的是删除可能破坏您的页面的危险标签。
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多