zoukankan      html  css  js  c++  java
  • [PHP] xpath提取网页数据内容

    想要使用xpath来解析html内容, PHP自带两个对象

    DOMDocumentDOMXpath,其中初始化 loadHtml一般都会报很多警告,但是并不影响使用,用@屏蔽错误。

        /**
         * 初始化DOMXpath对象
         *
         * @param [type]  $content  网页内容
         * @param [array] $pathinfo 匹配信息
         *
         * @return void
         */
        private function _createXpathObj($content, $patinfo)
        {
            // 如果没有xpath配置项,不初始化xpath
            if (!$this->_existsXpathParse($patinfo)) {
                return;
            }
            try {
                $dom = new DOMDocument();
                @$dom->loadHtml($content);
                $dom->normalize();
                $xpath = new DOMXpath($dom);
                $this->xpathObj = $xpath;
            } catch (Exception $e) {
                getService('logger')->warning('Parse html fail', ['content' => $content]);
            }
        }
    

    其中 $nodeDOMElement 对象。

        /**
         * 获取Xpath解析值
         *
         * @param [type] $pat 匹配模式
         *
         * @return string
         */
        private function _getXpathField($pat)
        {
            $objs = $this->xpathObj->query($pat);
            if ($objs->length > 0) {
                $node = $objs->item(0);
                $outerHTML = $node->ownerDocument->saveHTML($node);
                return trim($outerHTML);
                # 作为示例 输出innerhtml
                //$innerHTML = '';
                //foreach ($node->childNodes as $childNode){
                //     $innerHTML .= $childNode->ownerDocument->saveHTML($childNode);
                //}
                //return $innerHTML; 
                # 作为示例 输出文本不含标签
                //return $node->textContent; //$node->nodeValue;
            }
            return '';
        }
    

    示例

    <?php
            $dom = new DOMDocument('1.0','UTF-8');
            $dom->loadHTML('<html><body><div><p>p1</p><p>p2</p></div></body></html>');        
            $node = $dom->getElementsByTagName('div')->item(0);        
            $outerHTML = $node->ownerDocument->saveHTML($node);        
            $innerHTML = '';
            foreach ($node->childNodes as $childNode){
                    $innerHTML .= $childNode->ownerDocument->saveHTML($childNode);
            }
            echo '<h2>outerHTML: </h2>';
            echo htmlspecialchars($outerHTML);
            echo '<h2>innerHTML: </h2>';
            echo htmlspecialchars($innerHTML);        
    ?>




  • 相关阅读:
    OCP-1Z0-053-200题-178题-187
    OCP-1Z0-053-200题-179题-232
    OCP-1Z0-053-200题-181题-407
    OCP-1Z0-053-200题-182题-408
    OCP-1Z0-053-V13.02-408题
    OCP-1Z0-053-200题-183题-232
    OCP-1Z0-053-200题-184题-270
    OCP-1Z0-053-200题-185题-44
    OCP-1Z0-053-200题-186题-61
    OCP-1Z0-053-200题-187题-610
  • 原文地址:https://www.cnblogs.com/wangluochong/p/13222665.html
Copyright © 2011-2022 走看看