有时候会有需要从一个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

PHP使用DomDocument抓取HTML内容的更多相关文章

  1. 如何让搜索引擎抓取AJAX内容? 转

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用 Ajax 技术,根据用户的输入,加载不同的内容. 这种做法的 ...

  2. 【java】抓取页面内容,提取链接(此方法可以http get无需账号密码的请求)

    package 网络编程; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileOutpu ...

  3. 如何让搜索引擎抓取AJAX内容?

    越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处 ...

  4. 如何使用angularjs实现抓取页面内容

    <html ng-app="myApp"> <head> <title>angularjs-ajax</title> <scr ...

  5. Python抓取视频内容

    Python抓取视频内容 Python 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具 ...

  6. (未解决)flume监控目录,抓取文件内容推送给kafka,报错

    flume监控目录,抓取文件内容推送给kafka,报错: /export/datas/destFile/220104_YT1013_8c5f13f33c299316c6720cc51f94f7a0_2 ...

  7. PHP如何抓取https内容?记录一下。

    PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了.当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面,就不行了,而且效率及稳定性也不是很强.所以要是 ...

  8. Scrapy 使用CrawlSpider整站抓取文章内容实现

    刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实 ...

  9. nodejs抓取页面内容,并分析有无某些内容的js文件

    nodejs获取网页内容绑定data事件,获取到的数据会分几次相应,如果想全局内容匹配,需要等待请求结束,在end结束事件里把累积起来的全局数据进行操作! 举个例子,比如要在页面中找有没有www.ba ...

随机推荐

  1. Silverlight 雷达图和一种特殊泡泡画法

    原文:Silverlight 雷达图和一种特殊泡泡画法 自上次发了雷达图,也没怎么说一下. 这次又做了一种图,继续共享一下,就是以一个点为中心,周围绕着几个点,用一个箭头与中心相连并带有某些信息.圆 ...

  2. sqlserver检测数据库是否能连接的小技巧

    有时候可能需要检测下某台机器的服务是不是起来了,或者某台机器的某个库是不是能被连接又不能打开ssms也不想登陆服务器的话就可以用这个方法. 1.在桌面上右键创建个文本,然后改后缀名为udl以后保存(1 ...

  3. 第1章3节《MonkeyRunner源码剖析》概述:架构(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  4. effective C++ 札记 规定17 在单独的陈述newed对象插入智能指针

    // Test.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  5. 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台

    天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...

  6. SQL Server 2008 R2中,变表的右键弹出菜单中的“选择前1000行”为“选择所有行”

    原文:SQL Server 2008 R2中,变表的右键弹出菜单中的"选择前1000行"为"选择所有行" 从SQL Server 2008开始,微软为了提高查询 ...

  7. 4. SQL Server数据库状态监控 - 作业状态

    原文:4. SQL Server数据库状态监控 - 作业状态 有很多地方可以设置定时任务,比如:Windows的计划任务,Linux下的crontab,各种开发工具里的timer组件.SQL Serv ...

  8. javascript 控制台输出 图片 console.log 真强大 真佩服你们的创造力

    无意中,在百度知道页面发现了这货.居然能输出图片到控制台. 完全颠覆自己的三观,果断查阅其输出方法.后得知,原来如此. 曾经做过的项目中,同事把控制台做成一个网页形式方便远程控制和远程调用.没想到过这 ...

  9. [转载]C#播放流媒体的几种方法

    做视频开发要学的东西真多,不知道如何入门,乱打乱撞,慢慢摸索吧! 首先搭建Windows Meida Server ,方法很简单,试试就会.在这里需要声明的是,这几种方法 都可以播放 本地视频.并且基 ...

  10. Linux内核头文件与内核与库的关系

    看上一篇文章中对buildroot的介绍,里面的文档第 3.1.1.1 Internal toolchain backend 节内容 C库会去访问Linux kernel headers(*.h)文件 ...