微信开发学习笔记四(html网页解析)

以历史上的今天网页来实践,官网地址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);
        }
        
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值