2009-12-09 2 views
3

Найдено это один http://simplehtmldom.sourceforge.net/, но он не смог работатьНужен хороший HTML-парсер на PHP

extracting this page http://php.net/manual/en/function.curl-setopt.php 
and parse it to plain html, it failed and returned a partial html page 

Это то, что я хочу сделать, Перейти к HTML-страницы и получить отдельные компоненты (содержание все div и p в иерархии) Мне нравятся функции simplehtmldom, любой такой синтаксический анализатор, который хорош во всем коде (лучший и худший).

ответ

5

Я часто использую DOMDocument::loadHTML, который работает не так уж плохо, в общем случае - и мне нравится запрашивать документы, как только они загружаются как DOM, с Xpath.

К сожалению, в некоторых случаях, если HTML-страница действительно плохо сформирована, могут возникнуть некоторые проблемы синтаксического анализа ... Вот тогда вы начинаете понимать, что уважение к веб-стандартам - отличная идея. .

+0

Ну, как кто-то должен разбирать * чужой * код, совершенно не относящийся к уважению веб-стандартов не :-) – Joey

+1

@Johannes> really ;; но если вы попытаетесь разобрать людей других людей, есть вероятность, что вам придется создавать HTML тоже, день или другой ... И в тот день, вспомнив о трудностях, с которыми вы столкнулись crappy-HTML, может побудить вас писать чистые HTML-файлы (вскользь ...) –

0

Опираясь на ответ Паскаля Мартина ...

Я использую комбинацию CURL и XPATH. Ниже приведена функция, которую я использую в одном из моих классов.

protected function _get_xpath($url) { 
    $refferer='http://www.whatever.com/'; 
    $useragent='Googlebot/2.1 (http://www.googlebot.com/bot.html)'; 
    // create curl resource 
    $ch = curl_init(); 

    // set url 
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
    curl_setopt ($ch, CURLOPT_REFERER, $refferer); 
    curl_setopt($ch, CURLOPT_URL, $url); 

    //return the transfer as a string 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    // $output contains the output string 
    $output = curl_exec($ch); 
    //echo htmlentities($output); 

    if(curl_errno($ch)) { 
     echo 'Curl error: ' . curl_error($ch); 
    } 
    else { 
     $dom = new DOMDocument(); 
     @$dom->loadHTML($output); 
     $this->xpath = new DOMXPath($dom); 
     $this->html = $output; 
    } 

    // close curl resource to free up system resources 
    curl_close($ch); 
} 

Вы можете разобрать структуру документа с помощью evaluate и извлекать информацию, которую вы хотите

$resultDom = $this->xpath->evaluate("//span[@id='headerResults']/strong"); 
$this->results = $resultDom->item(0)->nodeValue; 
Смежные вопросы