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);        
    ?>




  • 相关阅读:
    java 微信公众服务平台 下发 模板消息
    java web实现 忘记密码(找回密码)功能及代码
    DES加密后get获取url参数无法解密问题
    java实现url转码、解码
    java 实现 DES加密 解密算法
    oracle sqlplus 导出csv文件
    oracle导出多CSV文件的靠谱的
    Oracle 释放过度使用的Undo表空间
    Archiving not possible: No primary destinations errors
    Linux 之 shell 比较运算符
  • 原文地址:https://www.cnblogs.com/wangluochong/p/13222665.html
Copyright © 2011-2022 走看看