以历史上的今天网页来实践,官网地址http://www.todayonhistory.com/
首先要在网上下载simple_html_dom.php文件
然后通过其中的方法来获取指定url的HTML页面
include_once 'simple_html_dom.php';
$url="http://www.todayonhistory.com/";
$html_analysis=file_get_html($url);
注意第一句中将下载的php文件包含在该文件中,这里该文件和下载的PHP文件在同一目录上
接下来的工作就是解析html文件了,其中的一些使用可以参考http://www.cnphp.info/php-simple-html-dom-parser-intro.html
我的目的是解析历史上的今天的事件,然后在html中找到这样的div,有很多,举一例如下所示
<div class="pic">
<a href="http://www.todayonhistory.com/11/5/19250.html" class="pica" title="首个“世界海啸日”" target="_blank"><img src="/style/images/grey.gif" data-original="http://www.todayonhistory.com/uploadfile/2016/1104/20161104022306938.jpg" alt="首个“世界海啸日”" class="roundies"></a>
<div class="t">
<span>2016年11月5日</span>
<a href="http://www.todayonhistory.com/11/5/19250.html" class="txt" target="_blank">首个“世界海啸日”</a>
</div>
</div>
先来了一个简单的解析html,代码如下
$divs = $html_analysis->find('div.pic');//查找类为pic的div
foreach ($divs as $div) {
$contentStr .= $div->children(1)->children(0)->innertext;//获取div中第二个子元素的子元素中的内容文本
$contentStr .= $div->children(0)->title . "\n";//获取div中第一个子元素标签中属性为title的值
}
上述实现成功后,就想实现微信中的多图文效果,一条图文需要title,picurl,url,这个仍然是依照上面html代码
于是便使用数组的方式来生成多图文数据如下
foreach ($divs as $div) {
$mtime= $div->children(1)->children(0)->innertext;//获取div中第二个子元素的子元素中的内容文本
$mcontent= $div->children(0)->title;//获取div中第一个子元素标签中属性为title的值
$mpicurl=$div->children(0)->children(0)->data-original;//获取图片地址
//图片地址如果是按根目录写,就加上根目录
if(strpos($mpicurl, "http")===false){
$mpicurl="http://www.todayonhistory.com".$mpicurl;
}
$murl=$div->children(0)->href;//访问地址
$content[]=array("Title"=>$mtime.$mcontent,"Description"=>"","PicUrl"=>$mpicurl,"Url"=>$murl);//插入一条数据
}
return $this->transmitNews($object, $content);//发送多图文
这样写本来是没有问题的,但是在获取属性的一行中,data-original属性中间有一个- ,对于PHP来说识别不了,结果$mpicurl返回的是空,网上找了半天,找不到,这样就只能另辟他进
我用的是字符串截取,用innertext获取整个<image>...</image>,然后获取以data-original开头的后面所有字符,再获取以alt开头的后面的所有字符,最后通过strlen来得到中间的部分,代码实现如下
$mpicurl=$div->children(0)->innertext;
$mpicurl=strstr($mpicurl, "data-original=");
$mpicurl=substr($mpicurl, 15,strlen($mpicurl)-15-strlen(strstr($mpicurl, "alt"))-2);
整个代码如下:(设置8的原因是图文消息最多只能发送8条)
public function getHistoryInfo($object)
{
include_once 'simple_html_dom.php';
$url = "http://www.todayonhistory.com/";
$html_analysis = file_get_html($url);
if (! isset($html_analysis)) {
$html_analysis->clear();
return $this->transmitText($object, "获取失败");
} else {
// $content[]=array("Title"=>"","Description"=>"","PicUrl"=>"","Url"=>"");
// $content= "历史上的" . date("m") . "月" . date("d") . "日\n";
$divs = $html_analysis->find('div.pic');//查找类为pic的div
$i=0;
foreach ($divs as $div) {
if($i<8){
$mtime= $div->children(1)->children(0)->innertext;//获取div中第二个子元素的子元素中的内容文本
$mcontent= $div->children(0)->title;//获取div中第一个子元素标签中属性为title的值
$mpicurl=$div->children(0)->innertext;
$mpicurl=strstr($mpicurl, "data-original=");
$mpicurl=substr($mpicurl, 15,strlen($mpicurl)-15-strlen(strstr($mpicurl, "alt"))-2);
if(strpos($mpicurl, "http")===false){
$mpicurl="http://www.todayonhistory.com".$mpicurl;
}
$murl=$div->children(0)->href;
$content[]=array("Title"=>$mtime.$mcontent,"Description"=>"","PicUrl"=>$mpicurl,"Url"=>$murl);
}
$i++;
}
return $this->transmitNews($object, $content);
}
}