PHP使用DomDocument抓取HTML内容
有时候会有需要从一个HTML页面来分离出你需要的一些数据来进行处理。
当然自己分析文件肯定可以,但是比较快速且方便的是使用正则表达式或者DOM。
鉴于正则表达式我不熟悉,所以我打算使用DOM来完成。
先谈谈我的需求,我要从一个HTML页面的一个表格中提取数据并且将这个数据整理出来加入到MySQL数据库中。
假设目标HTML中我感兴趣的Table有3列,分别是ID,Name,内容。
index.php;
<?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ require_once ( 'ContentManager.php' ); //建立Dom对象,分析HTML文件; $htmDoc = new DOMDocument; $htmDoc ->loadHTMLFile( $urlTarget ); $htmDoc ->normalizeDocument(); //获得到此文档中每一个Table对象; $tables_list = $htmDoc ->getElementsByTagName( 'table' ); //测试Table Count; $tables_count = $tables_list ->length; foreach ( $tables_list as $table ) { //得到Table对象的class属性 $tableProp = $table ->getAttribute( 'class' ); if ( $tableProp == 'target_table_class' ) { $contentMgr = new ContentManager(); $contentMgr ->ParseFromDOMElement( $table ); //这里myParser就完成了分析动作。然后就可以进行需要的操作了。 //比如写入MySQL。 $contentMgr ->SerializeToDB(); } } ?> |
ContentManager.php
<?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * Description of ContentParser * * @author xxxxx */ require_once ( 'ContentInfo.php' ); class ContentManager { //put your code here var $ContentList ; public function __construct() { $this ->ContentList = new ArrayObject(); } public function ParseFromDOMElement(DOMElement $table ) { $rows_list = $fundsTable ->getElementsByTagName( 'tr' ); $rows_length = $rows_list ->length; $index = 0; foreach ( $rows_list as $row ) { $contentInfo = new ContentInfo(); $contentInfo ->ParseFromDOMElement( $row ); $this ->ContentList->append ( $contentInfo ); } //test how many contents parsed. $count = $this ->fundsInfoArray-> count (); echo $count ; } public function SerializeToDB() { //写入数据库,代码略。 } } ?> |
contentinfo.php
<?php /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * Description of ContentInfo * * @author xxxxx */ class ContentInfo { //put your code here var $ID ; var $Name ; var $Content ; public function ParseFromDOMElement(DOMElement $row ) { $cells_list = $row ->getElementsByTagName( 'td' ); $cells_length = $row ->length; $curCellIdx = 0; foreach ( $cells_list as $cell ) { switch ( $curCellIdx ++) { case 0: $this ->ID = $cell ->nodeValue; break ; case 1: $this ->Name = $cell ->nodeValue; break ; case 2: $this ->Content = $cell ->nodeValue; break ; } } } } ?> |
一点小心得,DOM中每个Element都可以getAttribute取出属性,这些属性可以区分你分析的DOMObject。
举例来说,比如上述我分析的Target HTML有很多表格,但是我发现目标表格的class属性和其他表格是不一样的。
所以,这个属性就可以来区分我要分析的是哪个表格。
当然更多DOM的东西,大家可以去参考PHP Manual或者是,用IDE(NetBeans7.0就可以)转到类声明,看类接口。
有方法使用说明以及参数说明。可以参考参考。