php解析html类库simple_html_dom(2)
工具类官方文档:https://simplehtmldom.sourceforge.io/manual.htm
工具类下载地址:https://github.com/samacs/simple_html_dom
python实现:python pyquery 解析html数据(2)
1、getAction() 获取HTML中的基本信息。
结果截图:
2、threeTextAction() 比较属性 tag,outertext,innertext,plaintext 的区别。
结果截图:
3、代码:
<?php
/**
* @todo simple_html_dom工具类基本数据获取
* @author yfjs
* @date 2018/4/24
*/
class TestController extends Rest{
/**
* @todo 处理类
* @author yfjs
* @date 2019/4/24
* find(selector, N) 查找满足条件的第N条数据
*/
public function getAction(){
require_once APP_PATH."/library/simple_html_dom.php"; //引入simple_html_dom类型文件
$htmlObj = new simple_html_dom(); //工具类对象初始化
//加载方式有一下三种
/* $htmlObj->load_file('http://www.***.com'); // 从url中加载
$htmlObj->load('HTML字符串'); // 从字符串中加载
$htmlObj->load_file('/file/test.html'); //从文件中加载 */
//为了演示我使用第二种
$html = $this->getHtml(); //模拟HTML数据
$htmlObj->load($html);
//定位到这一行<div class="whole">;find方法返回的是一个二维对象数组,
//在已知结果只有1条的情况下,我们可以把第二个参数设为0,即二维数组里的第一条数据。
$articleObj = $htmlObj->find('body div.whole', 0);
//标题只有一个,我们定位到元素,获取索引为0的即可。
//这里echo $title;不写0的话会提示:Trying to get property of non-object in
$title = $articleObj->find('div.head h2', 0)->plaintext;
//作者、时间 属于同级目录, find(select, idx)方法的idx在这就体现出来了
$author = $articleObj->find('div.head div span', 0)->plaintext; //索引为0,同级div标签下的第1个span
$time = $articleObj->find('div.head div span', 1)->plaintext; //索引为1,同级div标签下的第2个span
//a链接,图片 我们要获取的是标签上的属性,直接 (->属性名)即可;内容是div标签,可以循环得到文字
$contentObj = $articleObj->find('div.content', 0); //0还是得加上。
//获取 [body div.whole div.content a] a标签的href属性
$aHref = $contentObj->find('a', 0)->href;
//获取 [body div.whole div.content a img] img标签的src属性
$imgSrc = $contentObj->find('a img', 0)->src;
//循环获取P标签的内容,这里就是把find到的二维对象数组循环
$pContent = '';
foreach ( $contentObj->find('div.info') as $val ){
$pContent .= trim($val->plaintext); //trim去除特殊字符
}
$htmlObj->clear(); //清空内存
echo '文章标题 - ' . $title . PHP_EOL.
'文章作者 - ' . $author . PHP_EOL.
'文章时间 - ' . $time . PHP_EOL.
'链接地址 - ' . $aHref . PHP_EOL.
'图片地址 - ' . $imgSrc . PHP_EOL.
'文字内容 - ' . $pContent;
die();
/* 打印内容 */
/*
文章标题 - 美好的一天
文章作者 - 御风剑士
文章时间 - 2019-04-24
链接地址 - http://www.***.com
图片地址 - http://images.***.com
文字内容 - 回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张
纸卖电话卡的小贩。我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。因为昨夜下雨的原因吗,
感觉空气好新鲜,身心愉悦脚步也很轻快。尽管没有太阳,但是我知道,今天又是美好的一天,也是生命中最年轻的一天。
*/
}
/**
* @todo 这四个属性的区别
* tag标签获取
* outertext 外文本:节点的HTML + 节点内的所有内容(包含HTML标签)
* innertext 内文本:节点内的所有内容(包含HTML标签)
* plaintext 纯文本:节点内的所有内容(不包含HTML标签)
*/
function threeTextAction(){
require_once APP_PATH."/library/simple_html_dom.php"; //引入simple_html_dom类型文件
$htmlObj = new simple_html_dom(); //工具类对象初始化
$html = $this->getHtml(); //模拟HTML数据
$htmlObj->load($html);
$contentObj = $htmlObj->find('body div.whole div.content', 0);
$tag = $contentObj->tag;
$outertext = $contentObj->outertext;
$innertext = $contentObj->innertext;
$plaintext = $contentObj->plaintext;
$htmlObj->clear(); //清空内存
echo '标签 - ' . $tag .PHP_EOL . PHP_EOL.
'外文本 - ' . $outertext .PHP_EOL . PHP_EOL.
'内文本 - ' . $innertext .PHP_EOL . PHP_EOL.
'纯文本 - ' . $plaintext .PHP_EOL;
die();
/* 打印内容 */
/*
标签 - div
外文本 -
<div class="content">
<a href="http://www.***.com">
<img src="http://images.***.com"/>
</a>
<div class="info">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>
<div class="info">
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
</div>
<div class="info">
因为昨夜下雨的原因吗,感觉空气好新鲜,身心愉悦脚步也很轻快。尽管没有太阳,但是我知道,今天又是美好的一天,也是生命中最年轻的一天。
</div>
</div>
内文本 -
<a href="http://www.***.com">
<img src="http://images.***.com"/>
</a>
<div class="info">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>
<div class="info">
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
</div>
<div class="info">
因为昨夜下雨的原因吗,感觉空气好新鲜,身心愉悦脚步也很轻快。尽管没有太阳,但是我知道,今天又是美好的一天,也是生命中最年轻的一天。
</div>
纯文本 -
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
因为昨夜下雨的原因吗,感觉空气好新鲜,身心愉悦脚步也很轻快。尽管没有太阳,但是我知道,今天又是美好的一天,也是生命中最年轻的一天。
*/
}
/**
* @todo 获取HTML数据
* @return string 返回HTML字符串
*/
function getHtml(){
$html = ' <html>
<head>
<title>大家好</title>
</head>
<body>
<!-- 文章START -->
<div class="whole">
<!-- 标题START -->
<div class="head">
<h2>美好的一天</h2>
<div>
<span>御风剑士</span>
<span>2019-04-24</span>
</div>
</div>
<!-- 标题SEND -->
<!-- 内容START -->
<div class="content">
<a href="http://www.***.com">
<img src="http://images.***.com"/>
</a>
<div class="info">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>
<div class="info">
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
</div>
<div class="info">
因为昨夜下雨的原因吗,感觉空气好新鲜,身心愉悦脚步也很轻快。尽管没有太阳,但是我知道,今天又是美好的一天,也是生命中最年轻的一天。
</div>
</div>
<!-- 内容END -->
</div>
<!-- 文章END -->
</body>
</html>';
return $html;
}
}