PHP xpath提取网页数据内容代码解析


Posted in PHP onJuly 16, 2020

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

DOMDocument,DOMXpath,其中初始化 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]);
    }
  }

其中 $node 为 DOMElement 对象。

/**
   * 获取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);    
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
从MySQL数据库表中取出随机数据的代码
Sep 05 PHP
php checkbox 取值详细说明
Aug 19 PHP
php获取字段名示例分享
Mar 03 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
php实现随机生成易于记忆的密码
Jun 19 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
PHP中串行化用法示例
Nov 16 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 #PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 #PHP
PHP number_format函数原理及实例解析
Jul 14 #PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 #PHP
PHP基于array_unique实现二维数组去重
Jul 14 #PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 #PHP
通过实例解析PHP数据类型转换方法
Jul 11 #PHP
You might like
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
JQuery之proxy实现绑定代理方法
2016/08/01 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
在Python中使用dict和set方法的教程
2015/04/27 Python
python计算对角线有理函数插值的方法
2015/05/07 Python
Python简单的制作图片验证码实例
2017/05/31 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
如何基于python实现归一化处理
2020/01/20 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
Python阶乘求和的代码详解
2020/02/14 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
教师的实习鉴定
2013/12/15 职场文书
毕业设计计划书
2014/01/09 职场文书
军神教学反思
2014/02/04 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
2015年征兵工作总结
2015/07/23 职场文书
早上好问候语大全
2015/11/10 职场文书
Python中time与datetime模块使用方法详解
2022/03/31 Python
Redis实现短信验证码登录的示例代码
2022/06/14 Redis
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技