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就可以)转到类声明,看类接口。

有方法使用说明以及参数说明。可以参考参考。

转载自:http://blog.csdn.net/xyzhaopeng/article/details/6626340

你可能感兴趣的:(document)