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
PHP使用DomDocument抓取HTML内容的更多相关文章
- 如何让搜索引擎抓取AJAX内容? 转
越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用 Ajax 技术,根据用户的输入,加载不同的内容. 这种做法的 ...
- 【java】抓取页面内容,提取链接(此方法可以http get无需账号密码的请求)
package 网络编程; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileOutpu ...
- 如何让搜索引擎抓取AJAX内容?
越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处 ...
- 如何使用angularjs实现抓取页面内容
<html ng-app="myApp"> <head> <title>angularjs-ajax</title> <scr ...
- Python抓取视频内容
Python抓取视频内容 Python 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具 ...
- (未解决)flume监控目录,抓取文件内容推送给kafka,报错
flume监控目录,抓取文件内容推送给kafka,报错: /export/datas/destFile/220104_YT1013_8c5f13f33c299316c6720cc51f94f7a0_2 ...
- PHP如何抓取https内容?记录一下。
PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了.当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面,就不行了,而且效率及稳定性也不是很强.所以要是 ...
- Scrapy 使用CrawlSpider整站抓取文章内容实现
刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实 ...
- nodejs抓取页面内容,并分析有无某些内容的js文件
nodejs获取网页内容绑定data事件,获取到的数据会分几次相应,如果想全局内容匹配,需要等待请求结束,在end结束事件里把累积起来的全局数据进行操作! 举个例子,比如要在页面中找有没有www.ba ...
随机推荐
- PHP-微信公众平台开发-接收用户输入消息类型并响应
原文:PHP-微信公众平台开发-接收用户输入消息类型并响应 <?php // 该代码块用于接收用户消息,根据用户输入的消息类型进行判断,文本,图片,视频,位置,链接,语音等,并取得值,处理后给予 ...
- CSS学习笔记:transition
CSS3的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击.获得焦点.被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值. 1.transit ...
- VBOX安装Centos设置分辨率为1366x768[已解决]
最近想了解下GTK+,但是对于直接在系统上搭建环境有点心里阴影,怕又把桌面玩挂,所以打算在虚拟机中先试试 本来打算使用Fedora的,怕gnome太吃资源所以下了个xfce的,不过貌似有BUG,无法安 ...
- Android从无知到有知——NO.4
因为我们做的是手机安全卫士,因此,我们需要一个地图定位功能,些相关的项目,也有一些教程.到百度官方下载了相关的jar包和API,但自己建项目的时候却不是那么顺利,bug不断,弄得心烦意乱,最后最终臣服 ...
- 将Model实体类对象作为WebService接口参数(转)
转自:http://www.cnblogs.com/fengyishou/archive/2009/02/27/1399281.html 关于web服务的有关基础知识,看了基本书,但是不敢在这里乱说, ...
- iOS:由URL成员UIImage
很多时候,我们只能得到URL.然后,需要建立一个UIImage. 在正常情况下,.我们一般通过SDWebImage直接施工UIImageVIew的image,如何使用URL直接施工UIImage它? ...
- PHP中实现在数据库中的增、删、查、改
其实要想在PHP中访问并获取到数据库中的数据其实并不难,下面我以例子为大家介绍: 首先,打开PHP软件和WampServer服务,确保在WampServer中的phpMyAdmin中有你要使用的数据表 ...
- wcf事务(随记)
----------------------------------------------------wcf事务:1.ACID:原子性.一致性.隔离性.持久性:2.事务:添加命名空间(using S ...
- EF 关系描述
网络上常常看到有ef 1对1 1对多等关系的描述,按照我的理解,其根本就是为了呈现出一个视图,我最近设计了一个ef关系,请大家看一看. 需求描述 在gps车辆信息管理中,有个开户需求,其根本就是三种关 ...
- Linux : fedora 安装 vnc server
Linux配置VNC服务 安装VNC服务端 #yum install vnc-server 配置VNC服务参数文件 编辑vncservers文件追加如下 #vi /etc/sysconfig/vncs ...