0

我正在使用简单的 html 解析 html 并删除页面菜单和页脚(例如,我选择http://codex.buddypress.org/developer-docs/the-bp-global/,然后可能是其他 url。)。但是我的代码返回Fatal error: Call to a member function find() on a non-object,哪里错了?谢谢。

require('simple_html_dom.php');
$webch = curl_init();
curl_setopt($webch, CURLOPT_URL, "http://codex.buddypress.org/developer-docs/the-bp-global/");
curl_setopt($webch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($webch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
$htmls = curl_exec($webch);
curl_close($webch);
$html = str_get_html($htmls);
$html = preg_replace('#<div(.*?)id="(.*?)head(.*?)"(.*?)>.*</div>#is', '', $html);
$html = preg_replace('#<div(.*?)class="(.*?)head(.*?)"(.*?)>.*</div>#is', '', $html);
$html = preg_replace('#<div(.*?)id="(.*?)menu(.*?)"(.*?)>.*</div>#is', '', $html);
$html = preg_replace('#<div(.*?)class="(.*?)menu(.*?)"(.*?)>.*</div>#is', '', $html);
$html = preg_replace('#<div(.*?)id="(.*?)foot(.*?)"(.*?)>.*</div>#is', '', $html);
$html = preg_replace('#<div(.*?)class="(.*?)foot(.*?)"(.*?)>.*</div>#is', '', $html);
foreach($html->find('a') as $element){
   echo $element.'<hr />';
}
4

1 回答 1

0

str_get_html似乎它是来自HTML DOM Parser的函数。它返回的不是字符串,这就是您要处理的内容。preg_replace期望一个字符串作为输入并返回一个字符串,然后将其设置为$html.

你的问题是你然后调用$html->find,这意味着你期望$html成为一个对象,作为返回的对象,str_get_html但这不是因为你刚刚将它分配给一个字符串,返回的preg_replace

您可能想要的是以下两件事之一:

  • preg_replace在做之前做字符串处理(使用) $html = str_get_html($htmls);。在该语句之后,它不再是一个字符串,您所做的任何处理都将是无用和错误的。
  • 使用您正在使用的库中可用的实际工具(据 Google 所知,简单的 HTML DOM 解析器)执行您正在做的任何事情。例如,类似的东西$html->find('div.menu')->class = '';

我会推荐第二点(如果它是你想要的),因为使用正则表达式处理 HTML 并不是一个好主意

于 2012-11-03T14:17:13.420 回答