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 相关文章推荐
使用PHP socke 向指定页面提交数据
Jul 23 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
php下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
Mar 25 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
PHP合并数组函数array_merge用法分析
Feb 17 PHP
浅谈php调用python文件
Mar 29 PHP
详解提高使用Java反射的效率方法
Apr 29 PHP
PHP设计模式(观察者模式)
Jul 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
数据库的日期格式转换
2006/10/09 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
ext 代码生成器
2009/08/07 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python进阶教程之文本文件的读取和写入
2014/08/29 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
Python实现淘宝秒杀功能的示例代码
2021/01/19 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
美国知名艺术画网站:Art.com
2017/02/09 全球购物
PHP如何自定义函数
2016/09/16 面试题
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
年检委托书
2014/08/30 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL
Redis基本数据类型List常用操作命令
2022/06/01 Redis