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 ...
随机推荐
- zoj 3822 Domination(dp)
题目链接:zoj 3822 Domination 题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望. 解题思路:大白书上概率那一张有一 ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
- MVC验证07-自定义Model级别验证
原文:MVC验证07-自定义Model级别验证 在一般的自定义验证特性中,我们通过继承ValidationAttribute,实现IClientValidatable,只能完成对某个属性的自定义验证. ...
- [C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页
原文[C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页 今天 Shih-Min 问我说,假设网页一开始是AJAX 会载入一些资料,但是透过WebClient 去抓 抓到都是J ...
- Python 图论工具
networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了经常使用的图与复杂网络分析算法, 能够方便的进行复杂网络数据分析.仿真建模等工作. 依赖工具: numpy pypar ...
- 自动编译CoffeeScript的Gruntfile.js
比如把coffee文件写在coffee/controller/文件夹下,新建js/controller文件夹,使用grunt运行项目,将自动编译coffee到相应的js文件夹下. module.exp ...
- 快速构建Windows 8风格应用15-ShareContract构建
原文:快速构建Windows 8风格应用15-ShareContract构建 本篇博文主要介绍共享数据包.如何构建共享源.如何构建共享目标.DataTransferManager类. 共享数据包 Da ...
- 如何通过js给QQ好友发送信息
一般我们在做页面活动的时候可能会碰到点击一个按钮把一些相关的信息通过QQ发送给你的好友,这种信息推送的功能该如何实现呢!下面我来介绍下使用方法! 代码如下: <!DOCTYPE HTML> ...
- ext日期加减任意天数
1.Ext.util.Format.date(new Date().add(Date.DAY, 5), 'Y-m-d'), 'Y-m-d') 2.Ext.util.Format.date(new Da ...
- Android开发Tips-1
打算记录一些自己在开发过程中遇到的一些技巧性代码,方便以后遇到相似功能时能够快速的找到,那就从这里开始吧. 1,如何截取当前屏幕(不包括当前Activity的Title)并分享: a,获取当前Acti ...