一直以来使用php解析html文档树都是一个难题。 simple html dom parser ?很好地解决了这个问题。可以通过这个php类来解析html文档,对其中的html元素进行操作 (php5+以上版本)。解析器不仅仅只是帮助我们验证html文档;更能解析不符合w3c标准的html文档。它
一直以来使用php解析html文档树都是一个难题。simple html dom parser?很好地解决了这个问题。可以通过这个php类来解析html文档,对其中的html元素进行操作 (php5+以上版本)。解析器不仅仅只是帮助我们验证html文档;更能解析不符合w3c标准的html文档。它使用了类似jquery的元素选择器,通过元素的id,class,tag等等来查找定位;同时还提供添加、删除、修改文档树的功能。和jq一样的操作还是很方便的。有三种方式调用这个类:从url中加载html文档从字符串中加载html文档从文件中加载html文档load_file('http://www.xxx.com');// 从字符串中加载$html->load('从字符串中加载html文档演示');//从文件中加载$html->load_file('path/file/test.html');?>
查找html元素可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用html dom解析类中的函数来访问这些对象,下面给出几个示例find('a');//查找文档中第(n)个超链接,如果没有找到则返回空数组.$a = $html->find('a', 0);// 查找id为main的div元素$main = $html->find('div[id=main]',0);// 查找所有包含有id属性的div元素$divs = $html->find('div[id]');// 查找所有包含有id属性的元素$divs = $html->find('[id]');?>
find('#container');// 找到所有class=foo的元素$ret = $html->find('.foo');// 查找多个html标签$ret = $html->find('a, img');// 还可以这样用$ret = $html->find('a[title], img[title]');?>
parent;// 返回子元素数组$e->children;// 通过索引号返回指定子元素$e->children(0);// 返回第一个资源速$e->first_child ();// 返回最后一个子元素$e->last _child ();// 返回上一个相邻元素$e->prev_sibling ();//返回下一个相邻元素$e->next_sibling ();?>
元素属性操作使用简单的正则表达式来操作属性选择器。[attribute] – 选择包含某属性的html元素[attribute=value] – 选择所有指定值属性的html元素[attribute!=value]- 选择所有非指定值属性的html元素[attribute^=value] -选择所有指定值开头属性的html元素[attribute$=value] 选择所有指定值结尾属性的html元素[attribute*=value] -选择所有包含指定值属性的html元素 如何避免解析器消耗过多内存有时候可能simple html dom解析器消耗内存过多。如果php脚本占用内存太多,会导致网站停止响应等一系列严重的问题。解决的方法也很简单,在解析器加载html文档并使用完成后,记得清理掉这个对象就可以了。clear();?>
下面看看微博热词抓取的源码示例memcache = new memcache; foreach ($cluster['memcached'] as $server) { $this->memcache->addserver($server['host'], $server['port']); } } function fetch($cache_key) { return $this->memcache->get($cache_key); } function store($cache_key, $val, $expire = 7200) { $this->memcache->set($cache_key, $val, memcache_compressed, $expire); } function flush() { $this->memcache->flush(); } function delete($cache_key, $timeout = 0) { $this->memcache->delete($cache_key, $timeout); }}function unicode_hex_2_gbk($name) { $a = json_decode('{a:' . $name . '}'); if (isset($a) && is_object($a)) { return iconv('utf-8', 'gbk//ignore', $a->a); return $a->a; } return null;}function curl_fetch($url, $time = 3) { $ch = curl_init(); curl_setopt($ch, curlopt_url, $url); curl_setopt($ch, curlopt_timeout, $time); curl_setopt($ch, curlopt_returntransfer, 1); $data = curl_exec($ch); $errno = curl_errno($ch); if ($errno > 0) { $err = [curl] url:{$url} ; errno:{$errno} ; info: . curl_error($ch) . ;; echo $err; $data = false; } curl_close($ch); return $data;}$cluster[memcached] = array( array(host => 10.11.1.1, port => 11211),);//$memcache = new tmemcache($cluster);$url = http://s.weibo.com/top/summary?cate=total&key=event;$cache_key = md5(weibo . $url);//$str = $memcache->fetch($cache_key);//if (!isset($_get[nocache]) && !empty($str)) {// echo $str;// exit;//}$content = curl_fetch($url);if ($content === false) exit;$html = str_get_html($content);$a = $html->find('script', 8);//测试$a = str_replace(array('\\', '\\/', \\n, \\t), array('', '/', , ), $a);$pos = strpos($a, '');$a = substr($a, $pos);//////////echo ;//echo ($a);//echo ;$html = str_get_html($a);$arr = array();foreach ($html->find('table[id=event]', 0)->find('.rank_content') as $element) { $arr[] = unicode_hex_2_gbk($element->find(a, 0)->plaintext);}$html->clear();$str = implode(,, $arr);//if (!isset($_get[nocache]))// $memcache->store($cache_key, $str, 3600);echo $str;
原文地址:抓取微博热词,使用simple_html_dom来操作html数据, 感谢原作者分享。