我一直在使用CURL来抓取网站一段时间以及简单的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();
我尽我所能,但它不起作用。我还能尝试什么?
答案 0 :(得分:10)
尝试更改此内容:
$html->load($curl_scraped_page);
对此:
$html->load($curl_scraped_page, true, false);
问题是simple_html_dom默认删除所有\ r \ n,在这种情况下它会破坏javascript代码,因为雅虎不会以分号结束它。
您可以在浏览器控制台上看到此错误,您还可以看到simple_html_dom删除查看来源的换行符。
答案 1 :(得分: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();
但第一种方式更好(更清洁)