php html解析器Simple HTML Dom

最近在每天工作之余抽取一点小时间做一个小的web应用,中间需要一些原始数据的抓取,用于测试,在网上找到了PHP Simple HTML Dom,是一个简单的HTML DOM解析器,支持PHP5+以上版本,支持无效的HTML,提供了比较简单的方法来处理HTML元素。是一个开源项目。

在使用中基本能够满足目前的需要,相对对于HTML的处理还是比较方便的,就是效率跟占用内存貌似不太理想,可能是对其使用上不是很对路。总来的来说,用这个东西入门还是比较快速的。

1. 开始使用

首先下载解压缩,然后将simple_html_dom.php文件包含进要编写的脚本文件中,加载要处理的html,支持三种模式的html加载,分别是『从url中加载,从字符串中加载,从文件中加载』。

Hello World!');
//从文件中加载
$html = file_get_html('example.htm');

从字符串加载网上文件需要先从网络下下载,使用cURL比较好一些,需要在php配置文件中打开php扩展php_curl。

$url = 'http://www.example.com';
$ci = curl_init();
curl_setopt($ci,CURLOPT_URL,$url);
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ci);

2. 查找html元素

使用find函数查找,返回包含对象的数组,常见的查找如下。

//查找超链接元素
$alink = $html->find('a');
//查找第n个连接元素
$alink = $html->find('a',5);
//查找id为main的div
$mainDiv = $html->find('div[id=main]');
//查找所有定义了id的div
$idDiv = $html->find('div[id]');
//查找所有定义了id的元素
$idAll = $html->find('[id]');
//查找样式类为info的元素
$classInfo = $html->find('.info');
//支持嵌套子元素查找
$ret = $html->find('ul li');
//查找多个html元素
$ret = $html->find('a,img,p');
//....

3. 其他

可以使用内置的函数来进行元素的定位,返回父元素parent,返回子元素数组children,返回第一个子元素first_child,返回最后一个子元素last_child,返回前一个相邻元素prev_sibling,返回后一个相邻元素next_sibling等。

提供简单的正则表达式来过滤属性选择器,类似于[attribute]的格式。

每个对象都有4个基本属性:
tag — 返回html标签名
innertext — 返回innerHTML
outertext — 返回outerHTML
plaintext — 返回HTML标签中的文本

返回元素属性值

//返回$alink的href值
$link = $alink->href;

通过设置元素的属性值可以对元素进行添加、修改、删除操作。

//删除url连接
$alink->href = null;
//元素的修改
$ret->outertext = '
';
$ret->outertext = '';
$ret->outertext = $ret->outertext . '
other
';
$ret->outertext = '
Welcome
' . $ret->outertext;

-EOF-

php文件操作基础

在有些场合中需要以文件的形式来对内容进行存储,通常这时候需要对文件进行一系列的操作,PHP中对于文件的操作跟其他计算机程序设计语言对文件的操作类似,对于文件的操作主要包括三个部分,以及围绕这三部分提供的辅助性函数来完成文件操作的工作。

(1)文件的创建与打开;
(2)文件的操作;
(3)文件的关闭;

在PHP中,通过一系列的函数来完成文件的操作,常用的函数及其简要说明罗列如下:

//文件打开,完成文件打开(在文件不存在时可创建文件),依赖于文件中模式的不同而具有不同的操作
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
//$filename 打开或者要创建文件的路径及文件名,为了便于移植,使用反斜杠/为佳
//$mode 是文件打开的模式,有很多模式,比较常用的r,w,a,同样为了便于移植,建议mode中增加b(二进制)
//通常读文件为 rb ,写文件为 ab,分别表示以二进制读文件及以二进制向文件追加内容
//在文件打开操作过程中出现错误请首先检查文件所在的路径的权限设置

//文件操作函数

//写操作相关函数
//把$string的内容写到文件指针$handle
int fwrite ( resource $handle , string $string [, int $length ] )  
//函数是fwrite的别名函数
fputs() 

//也能完成写操作,不同的是集成了fopen(),fwrite(),fclose(),使用该函数不用再打开关闭文件
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) 

//读操作相关函数
//逐行读取
string fgets ( resource $handle [, int $length ] ) 
//逐行读,能够过滤标记
string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] ) 
//逐行读,能够根据定界符输出到数组
array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] )
//一次性读取一个文件并将文件内容发送到标准输出,包含了文件打开与文件关闭操作
int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
//先要打开文件,然后将文件指针所指向的文件内容发送到标准输出
int fpassthru ( resource $handle )
//把结果发送到一个数组中
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
//一次读取一个字符
string fgetc ( resource $handle )
//读取任意长度字节的内容
string fread ( resource $handle , int $length )

//文件关闭
bool fclose ( resource $handle )

//文件操作中常用的函数
//检查文件或目录是否存在
bool file_exists ( string $filename )
//获取文件大小,返回文件大小的字节数
int filesize ( string $filename )
//删除文件
bool unlink ( string $filename [, resource $context ] )
//复位文件指针位置
bool rewind ( resource $handle )
//在文件指针中定位
int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )

函数的具体详细的说明在php.net上可以查到,下面练习一下文件的操作,练习名称为『简易日记』,需求如下:

(1)每日记录的内容以年-月-日.txt保存在数据目录下;
(2)首页写日记,并显示以往的记录;
(3)显示单页记录内容;

日记填写界面:

diary

具体代码如下

首页(index.php)



  
    
    简易日记--php文件操作练习
    
  
  
    

我的日记本

写日记

日记主题

日记内容


日记列表


$value" . " | "; } ?>

保存处理页(diaryprocessed.php)

当前不能处理您提交的日志,请稍后再试!

"; echo "返回"; } fwrite($fp,$output); flock($fp,LOCK_UN); fclose($fp); echo '日记提交成功!'; echo "返回";

查看内容页(viewdiary.php)




  
    
    简易日记
    
  
  
    写日记
    

所有源文件下载:diary

-EOF-

《精益创业》读后总结笔录

从4月21日读完《四步创业法》后紧接着就开始阅读《精益创业》这本书,差不多近2个月的时间,这阅读的效率着实让人蛋疼,不管怎么说好在也是断断续续的于今日读完了。保持持续的阅读是一件值得肯定的事情,首先鼓励一下自己。

这是一本关于新创企业成长思维的书,主要在丰田精益生产基础上建立的关于新创公司如何能够尽可能的获得成功,为此提供了一系列的方法与思维。书中的内容围绕着新创企业及其相关活动场景,但里面讲述的方法同样也适用于日常多种事情的处理。

『新创企业』的定义有两部分组成:一部分是由人组成的机构,另一部分是在极端不确定的情况下,开发的新产品或新服务。

新创企业的奋斗过程我们可以称之为创业,创业始于一些愿景,因为任何事情都是极端不确定的,所以我们的愿景或者说是idea都是『未经证实的假设』,大部分情况下这些愿景都是我们一厢情愿的假设,围绕着愿景做周密详尽的计划按部就班进行会导致直到最后阶段才能获得反馈,要么一步登天,要么直接就下地狱。

尽早的验证这些未经证实的假设,使其变成『经证实的认知』,则大大降低风险,越早找到客户,越早知道客户认为什么东西是有价值的对于创业过程越有利。

通过『开发-测量-认知』的迭代反馈循环可以快速获取反馈,每一次迭代反馈循环过程都是从未经证实的假设到经证实的认知,根据经证实的认知进行调整或者进行转型,这个迭代反馈循环需要快速完成,这就是精益创业的核心。

未经证实的假设包括价值假设和增长假设,迭代反馈循环起始不需要大而全,只要开发能够体现创新点和核心价值的最小化可行产品即可,目的是验证假设是对的。如果核心假设不对,可尽早调整或者转型,如果反馈良好,就可以继续在此基础上进行进一步的迭代。

以小批量可行化产品快速迭代前进能够最大的节省资源,避免浪费,而且能够以最小的成本来修正错误。

快速迭代的反馈循环中,要建立真实有效的测量,也就是创新核算,需要一系列指标数据来测量,这些测量的指标要能反映产品特性的变化与业务增速之间的因果关系,搜集基础运营数据,确定核算基线,核算不能核算累计的总数增长,而是要核算增速,比较好的方式是核算同周期内的指标是否是符合上升的预期。

每一次迭代反馈循环结束获取经证实的认知后,有两个选择,继续坚持改进或者转型。

——————书中其他摘录———————

转型列表

(0)放大转型
(1)缩小转型
(2)客户细分市场转型
(3)客户需求转型
(4)平台转型
(5)商业架构转型
(6)价值获取转型
(7)增长引擎转型
(8)渠道转型
(9)技术转型

增长来自何方?

(0)口碑相传
(1)产品使用带来的衍生效应
(2)有资金来源的广告
(3)重复购买或使用

增长引擎

(0)黏着式增长引擎
(1)病毒式增长引擎
(2)付费式增长引擎

书中经典语录:

成功地执行一项无意义的计划是导致失败的致命原因
如果企业费尽心思开发出来的产品没人想要,那么是否按时、按预算完成计划就无关紧要了
没什么比高效地做一件根本不该做的事更加徒劳的了
我们未来的繁荣取决于我们集体想象力的质量

 

维护个人站点常用到的操作备忘

如果拥有自己的主机或者vps,在日常中的维护中会有一些操作,主要体现在内容更新、备份,数据库备份,本地测试等诸多内容。我选用的是Linode VPS,用的是ubuntu作为操作系统,上面主要部署了自己的web站点和基于wordpress的个人博客,日常难免进行一些维护,由于维护不是非常的频繁,所以有必要对用到的操作做一下备忘记录。

1、mysql的备份与恢复

数据备份
mysqldump -uroot -p yourdestdb> target.sql
其中 
yourdestdb 是要备份的数据库
> 是备份符号
target.sql 是备份的文件名

数据恢复
mysql -uroot -p yourtargetdb< /destpath/dest.sql
其中
yourtargetdb 是要恢复的目标数据库
< 是恢复符号
destpath 是备份数据文件的路径
dest.sql 是备份文件名

2、文件目录的压缩

tar -cpzf /backup/target.tar.gz /dest
压缩dest目录,保存在backup目录中,压缩文件为target.tar.gz
c 新建 p 保留权限 z 使用gzip处理 f 指定存档或设备

3、在本地调试wordpress

有时会需要需要在本地调试wordpress,将vps上的数据导入本地后,需要处理四部分的内容

(1)修改配置文件wp-config.php,使用文本编辑器打开编辑
(2)修改数据库表wp_options中的option_value替换为本地url
(3)修改数据库表wp_posts中的guid替换为本地url
(4)修改数据库表wp_posts中的post_content替换为本地url

update wp_options set option_value = replace(option_value,"http://www.youinterneturl.com","http://youlocalhosturl");
update wp_posts set guid = replace(guid,"http://www.youinterneturl.com","http://youlocalhosturl");
update wp_posts set post_content = replace(post_content,"http://www.youinterneturl.com","http://youlocalhosturl");

-EOF-

消毒供应中心综合信息管理系统-包装篇

包装是消毒供应中心第三个工作流程,是紧随着清洗之后的工作,包装主要的工作是按计划完成器械包的包装工作,通常在医院的通俗的称为配包打包,说白了就是按照器械包的组成,选用包装材质将其包装起来,最终以供临床科室使用。从其工作内容我们可以看到比较重要的信息包括:

(1)包装的计划来源
(2)操作人员的信息来源
(3)包装材质对于管理的影响
(4)器械包的标识的建立
(5)器械包的组成

建立消毒供应中心综合信息管理系统在包装阶段的工作就是要合理的管理上述五个部分的内容,具体的工作就是根据包装计划建立器械包标识、组成、时间及操作工作人员信息,按照不同的包装材质对于有效期的影响进行管理,在计算机辅助下建立图文并茂的器械及器械包相关信息,提高该阶段工作效率。

包装计划来源主要有两方面,一方面为当天回收期间回收的器械包数量,一般情况下会在回收完毕后按照回收数量进行包装,另一方面来自科室的请领,科室人员可依据需求在管理系统中直接填写器械包请领单,这两方面构成当天器械包包装计划。在大多数医院中,根据回收期间数目包装是按照科室基数来进行统一管理的,建立科室小库存下的器械包基数,每日按照其基数进行补充。

操作人员的信息主要根据工作岗位建立配包人员角色及打包人员角色,可为相应人员制作人员标识卡,配合以自动识读设备提高工作效率,可采用条形码人员工作卡或RFID人员工作卡,配合以对应的条码扫描设备及RFID识读设备,操作人员信息在该阶段中会体现其工作量的记录,从而形成工作绩效考核的一方面数据。

包装材质的不同会影响器械包的有效期,同时也会影响到整个部门的核算,对于可重复使用的包装材质及一次性包装材质其核算成本是不同的,需要针对包装材质建立数据字典及统计其使用消耗,最终纳入成本核算。

确定包装的计划后,按照包装计划和操作人员的安排,为器械包生成标识,用于整个流程的追溯,标识需具有唯一性,比较常见的可采用条形码(一维、二维)或者使用RFID标签,条形码为一次性使用,一个周期下来后在回收后抛弃。RFID标签可重复多次使用。两种标识各有优缺,条形码除了能生成机器快速识读信息同时也能生成视觉识读信息,具有良好的阅读性,不好的一方面是相关材质损耗也是不少的,RFID标签虽然能够重复使用,但是其视觉识读方面不是很好,另一方面目前没有很好的能够非常便捷的跟器械包捆绑在一起的方式。

信息管理系统配合以声音提示,每完成一个器械包的包装,扫描器械包标识,以确保按照计划完成包装,有遗漏则进行提示,在工作过程中,配合以单件器械及整体器械包的图形照片,图文并茂的完成器械包的包装工作。

——————这是分割线——————

外来器械也同样包括在整个系统中,在回收环节增加外来器械的登记工作,其后按照消毒供应中心工作流程完成相应的清消灭菌发工作。

对于器械包的有效期来说,根据地域气候的不同,其有效期也具有不同的时间,这些内容在基础数据字典中都需要进行提现。

对于单品器械来讲,把它作为一类特别的器械包来进行管理能够很好的利用整个系统。

如果对于器械包定价,可进行科室之间的使用结算。

——————这是分割线——————

包装完毕后将器械包整齐放入灭菌车中,并放入灭菌指示卡,等待灭菌然后存储使用,整体来讲包装还是比较简单的,在当前阶段比较推荐的是用条形码来进行器械包的标识,RFID从材质上,与器械包的捆绑方式上目前解决办法不是太好,而且无法肉眼从视觉上看到器械包的品名、有效期、灭菌时间等众多信息。

—EOF—