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 ...
随机推荐
- 使用微软 URL Rewrite Module 开启IIS伪静态
原文 使用微软 URL Rewrite Module 开启IIS伪静态 在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.A ...
- IOS中TableView的使用(1) -创建一个简单的tableView
创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
原文:[ASP.NET MVC]如何定制Numeric属性/字段验证消息 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字, ...
- CSS3制作日历
目标是制作如下面DEMO显示的一个日历效果: HTML Markup 先来看看其结构: <div class="calendar"> <span class=&q ...
- 注意,WebDeploy服务会占用80端口。(Windows关闭了IIS,80端口任然被占用)
最近遇到一个很奇怪的事情,Windows上的 IIS 网站 全关掉了,80端口仍然被占用.然后我新装了一台服务器,一个一个组件地装,装一个测一次,最后发现,WebDeploy这个组件,会占用80端口. ...
- C语言内存对齐(2)
前两天参加了360测试实习生的笔试,碰到了一个有关c语言内存对齐的题目,回来后实现了一下,下面是代码: #include <stdio.h> #include <stdlib.h&g ...
- [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索
一个. 百度地图城市位置和POI搜索知识 上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...
- log4net项目中如何配置,以下详解
log4net.config配置文件 <?xml version="1.0" encoding="utf-8"?> <log4net debu ...
- 【转】仿QQ5.0侧滑菜单ResideMenu
本文由孙国威 原创.如需转载,请注明出处! 原文:http://blog.csdn.net/manoel/article/details/39013095 为了后续对这个项目进行优化,比如透明度动画. ...
- sql like 时间需要做转换
EG: where Convert(varchar(100),[字段名],120) like '2010-10-10%'