PHP使用DOMDocument采集
admin
2023-06-29 02:02:52
0

采集是很多公司都做最的一件事,能够快速的获取别人辛苦得来的数据,虽为不道义,但无法禁止!


PHP采集一般方式有:

  1. 正则采集。

  2. 使用DOM对象采集。

  3. 使用字符串函数提取。


这里只说下DOM对象采集的一些问题:


PHP有DOM对象专门用来处理HTML或XML文件,非常方便。

$dom = new DOMDocument('1.0','GBK');//创建DOM对象
@$dom->loadHTMLFile($url);//加载对应的URL地址HTML内容
$xpath=new DOMXPath($dom);//创建DOMXPath对象

DOMXPath对象是一个支持 XPath 路径表达式,http://www.w3school.com.cn/xpath/

XPath 路径表达式类似 JQuery选择器一样,可以方便的找到对应的节点然后提取内容,当然 XPath 的选择方式要远比 JQuery 多。而且还支持很多种函数处理。


注意

@$dom->loadHTMLFile($url);//加载对应的URL地址HTML内容

这句代码前面最好加上 @ 符号,因为在加载解析HTML内容时,或多或少会出现错误,如:在HTML页面内一些 & 符号要转义成 & ,html实体符号必须以 ;结束等等 才能顺利解析。而这类要求在采集过程中是不可能的。


采集过程中最让人麻烦的是中文字符处理,使用正则采集时,中文字符加在正则内虽然方便但容易出错,正则中写入中文必须保证被采集的字符集与当前系统代码字符集是相同的,否则匹配很容易失败。

使用DOMDocument解析HTML内容,也容易出现中文问题,一般是乱码,其主要原因是HTML结构不标准,

出现乱码都是字符集的问题,一般在HTML的head标签要指定字符集

当这个标签不存在时,DOMDocument在解析时就会以默认的方式去解析这个HTML内容,导致中文编码错误。


所以在使用DOMDocument采集时不要直接使用

@$dom->loadHTMLFile($url);//加载对应的URL地址HTML内容

方式直接加载HTML,这样只要所采集的HTML内容没有包含字符集的指定,整个HTML内容解析后中文就不能用。

最好使用:

$ch = curl_init($url);//创建连接
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//输出内容
curl_setopt($ch, CURLOPT_TIMEOUT, 10);//设置超时时间
$html =  curl_exec($ch);//执行连接,获取内容
if($err=curl_error($ch)){//判断是否出错
   die($err);
}else{
    //判断是否存在这个标签
   if(!stripos('"Content-Type"', $html)&&!stripos('content="text/html;', $html)){
       $meta='';
       $html=str_replace('', $meta, $html);
   }
}
curl_close($ch);
$dom = new DOMDocument('1.0','GBK');//创建DOM对象
@$dom->loadHTML($html);//加载对应的URL地址HTML内容
$xpath=new DOMXPath($dom);//创建DOMXPath对象

对应所采集的页面字符集,必须核对好。

DOMXPath有两个函数用来操作内部节点:

query,和evaluate

query:取出给定的XPath表达式节点列表,只要表达式合法,返回DOMNodeList对象,否则返回false。

evaluate:取出给定XPath表达式节点列表,只要表达式合法并且有匹配的节点返回DOMNodeList对象,否则返回false。


两个函数都是提取节点,只是返回值上有些区别。

DOMNodeList 对象有一个函数和一个属性:

/* 属性,节点列表个数 */
readonly publicint $length ;
/* 方法获取第几个节点 */
DOMNode DOMNodelist::item ( int $index )


使用item函数获取的节点 DOMElement 对象

可以使用 getAttribute 获取节点属性值,也可以使用 nodeValue 属性获取节点内容。

相关内容

热门资讯

免去南开大学陈某院长、中山大学... 刚刚,南开大学和中山大学发布情况通报。南开大学:免去陈某院长职务南开大学通报中指出,论文第一作者郑某...
绿色算力全栈AI平台在呼和浩特...   新华社呼和浩特5月30日电(记者侯维轶)30日,绿色算力全栈AI平台——内蒙古词元交易平台在内蒙...
北京太空智算研究院在北京亦庄成... 红星资本局5月30日消息,近日,北京太空智算研究院在北京经济技术开发区(简称“北京经开区”,又称“北...
第二届西部医学科技创新学术大会... 封面新闻记者 邱添 2026年5月30日,在第十个全国科技工作者日来临之际,一场汇聚医学前沿智慧与创...
地博光电取得存储自动化料库专利... 国家知识产权局信息显示,昆山地博光电材料有限公司取得一项名为“一种存储自动化料库”的专利,授权公告号...
香港政务司司长谈黎家盈:香港由... 据凤凰卫视报道,首位来自香港的载荷专家黎家盈早前随神舟二十三号载人飞船升空。香港政务司司长陈国基表示...
亚美尼亚大选在即,俄方突然召回... 【文/观察者网 阮佳琪】当地时间周五(5月29日),在哈萨克斯坦首都阿斯塔纳,亚美尼亚由副总理格里戈...
财政部在香港发行60亿元人民币... 新华社北京5月30日电 《中国证券报》30日刊发文章《财政部在香港发行60亿元人民币绿色主权债券》。...
原创 追... 2026年5月30日是全国科技工作者日。在吉林省长春市王大珩故居前,这位中国光学事业奠基人的新雕像揭...
京东618独家首发欧姆龙血糖尿... 当前,国民居家慢病管理意识持续增强,血糖、尿酸等健康指标的常态化监测,早已成为家庭健康管理的刚需。5...