一起使用SimplePie和Simple HTML DOM

时间:2016-01-24 00:45:56

标签: php simple-html-dom simplepie

我尝试使用SimplePie通过RSS Feed提取链接列表,然后使用Simple HTML DOM抓取这些Feed来提取图像。我能够让SimplePie工作来拉取链接并将它们存储在一个数组中。我还可以使用Simple HTML DOM解析器来获取我正在寻找的图像链接。问题是,当我尝试同时使用SimplePie和Simple HTML DOM时,我收到500错误。这是代码:

set_time_limit(0);
error_reporting(0);

$rss = new SimplePie();
$rss->set_feed_url('http://contently.com/strategist/feed/');
$rss->init();

foreach($rss->get_items() as $item)
  $urls[] = $item->get_permalink();
unset($rss);

/*
$urls = array(
'https://contently.com/strategist/2016/01/22/whats-in-a-spotify-name-and-5-other-stories-you-should-read/',
'https://contently.com/strategist/2016/01/22/how-to-make-content-marketing-work-inside-a-financial-services-company/',
'https://contently.com/strategist/2016/01/22/glenn-greenwald-talks-buzzfeed-freelancing-the-future-journalism/',
...
'https://contently.com/strategist/2016/01/19/update-a-simpler-unified-workflow/');
*/ 

foreach($urls as $url) {
  $html = new simple_html_dom();
  $html->load_file($url);
  $images = $html->find('img[class=wp-post-image]',0);
  echo $images;
  $html->clear();
  unset($html);
}

我注释掉了urls数组,但它与SimplePie循环创建的数组相同(我是从结果中手动创建的)。第一次通过循环时,它在find命令上失败。如果我注释掉$ rss-> init()行并使用静态url数组,代码全部运行时没有错误,但当然不能给我想要的结果。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

simple_html_domSimplePie之间存在奇怪的不兼容性。加载html时,未加载simple_html_dom->root,导致任何其他操作出错。

奇怪的是,传递给函数模式而不是对象模式,对我来说它运行良好:

$html = file_get_html( $url );

而不是:

$html = new simple_html_dom();
$html->load_file($url);

无论如何,simple_html_dom因引起问题而闻名,尤其是内存使用问题。

<强>编辑:

好的,我找到了这个bug。 它驻留在simple_html_dom->load_file()上,调用标准函数file_get_contents(),然后通过error_get_last()检查结果,如果发现错误,则取消设置自己的数据。但是,如果之前发生错误(在我的测试中SimplePie输出警告./cache is not writeable),simple_html_dom解释此先前错误为file_get_contents()失败。

如果您安装了PHP 7,则可以在error_clear_last()之后致电unset($rss),并且您的代码应该正常运行。否则,您可以使用我上面的代码或将html数据预加载到变量中,然后调用simple_html_dom->load()而不是simple_html_dom->load_file()