在php上需要一个好的HTML解析器

时间:2009-12-09 12:02:04

标签: html parsing

找到这个http://simplehtmldom.sourceforge.net/,但它无法正常工作

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的功能,需要任何这样的解析器,它在所有代码(最好和最差)都很好。

3 个答案:

答案 0 :(得分:5)

在一般情况下,我经常使用DOMDocument::loadHTML,这种方法效果不算太差 - 而且我喜欢在将文档作为DOM加载Xpath时查询文档。

不幸的是,我认为,在某些情况下,如果HTML页面确实形成错误,可能会出现一些解析问题... 当你开始理解尊重网络标准是一个好主意时。 ..

答案 1 :(得分:0)

以Pascal MARTIN的回应为基础......

我使用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;

答案 2 :(得分:0)

我找到了最适合我用的地方 - http://querypath.org/