6

我一直在使用 CURL 来抓取网站以及 Simple HTML DOM。我体验到 CURL 更适合抓取网站。不过我真的很喜欢 Simple HTML DOM 的简单性。所以我想为什么不将两者结合起来,我尝试了:

require_once('simple_html_dom.php');

    $url = 'http://news.yahoo.com/';

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $curl_scraped_page = curl_exec($ch);

    $html = new simple_html_dom();
    $html->load($curl_scraped_page);


    foreach($html->find('head') as $d) {
        $d->innertext = "<base href='$url'>" . $d->innertext;
    }

    echo $html->save();

我尽力了,但它不起作用。我还能尝试什么?

4

2 回答 2

12

尝试改变这个:

$html->load($curl_scraped_page);

对此:

$html->load($curl_scraped_page, true, false);

问题是 simple_html_dom 默认删除所有 \r \n ,在这种情况下它会破坏 javascript 代码,因为雅虎不会以分号结束它。

您可以在浏览器控制台看到此错误,您还可以看到 simple_html_dom 删除了查看源代码的换行符。

于 2013-05-18T09:56:02.873 回答
1

我想我会在类中添加一个函数

function loadWithoutRemovingStuff($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
{
    $this->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText);

    while ($this->parse());

    $this->root->_[HDOM_INFO_END] = $this->cursor;
    $this->parse_charset();

    return $this;
}

然后调用该函数而不是默认load函数。

或者,因为在这个类中一切都是公开的,

 $html = new simple_html_dom();
 $html->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText);

 while ($html->parse());
 $html->root->_[HDOM_INFO_END] = $html->cursor;
 $html->parse_charset();

但第一种方法更好(更清洁)

于 2013-05-18T09:00:08.257 回答