文档章节

phpQuery—基于jQuery的PHP实现

 谢锡鹏
发布于 2014/09/25 01:50
字数 961
阅读 1443
收藏 86

Query的选择器之强大是有目共睹的,phpQuery 让php也拥有了这样的能力,它就相当于服务端的jQuery。

先来看看官方简介:

phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library.

Library is written in PHP5 and provides additional Command Line Interface (CLI).

 

存在的意义

我们有时需要抓取一个网页的内容,但只需要特定部分的信息,通常会用正则来解决,这当然没有问题。正则是一个通用解决方案,但特定情况下,往往有更简单快 捷的方法。比如你想查询一个编程方面的问题,当然可以使用Google,但stackoverflow 作为一个专业的编程问答社区,会提供给你更多,更靠谱的答案。

对于html页面,不应该使用正则的原因主要有3个

1、编写条件表达式比较麻烦 
尤其对于新手,看到一堆”不知所云”的字符评凑在一起,有种脑袋都要炸了的感觉。如果要分离的对象没有太明显的特征,正则写起来更是麻烦。

2、效率不高 
对于php来说,正则应该是没有办法的办法,能通过字符串函数解决的,就不要劳烦正则了。用正则去处理一个30多k的文件,效率不敢保证。

3、有phpQuery 
如果你使用过jQuery,想获取某个特定元素应该是轻而易举的事情,phpQuery让这成为了可能。

 

浅析phpQuery

phpQuery是基于php5新添加的DOMDocument。而DOMDocument则是专门用来处理html/xml。它提供了强大xpath选 择器及其他很多html/xml操作函数,使得处理html/xml起来非常方便。那为什么不直接使用呢?这个,去看一下官网的函数列表 就知道了,如果对自己的记忆力很有信心, 不妨一试。

 

几个简单的例子

 

获取蓝色理想最热的招聘职位

 

  1. <?  

  2. include 'phpQuery.php';  

  3. phpQuery::newDocumentFile('http://job.blueidea.com');  

  4. $companies = pq('#hotcoms .coms')->find('div');  

  5. foreach($companies as $company)  

  6. {  

  7.    echo pq($company)->find('h3 a')->text()."<br>";  

  8. }  

 

小结

  • pq()就像jQuery里的$()

  • 基本上jQuery的选择器都可以用在phpQuery上,只要把’.'变成’->’

  • phpQuery提供了好几种载入文件的方法,有的使用字符串,有的使用文件(包括url),选 择的时候要注意

  • 基本上这一页 就很能说明问题了

其他解析器

simplehtmldom 也是个不错的html解析器,使用起来也挺方便,是基 于正则的,所以没有phpQuery那么强大,如果没有太高的要求,也基本够用了。

yql 是yahoo出的一款使用类似SQL的语言,来获取相应的数据,也很强大,无须任何类 库,可以直接调用,支持xpath,如果对SQL语句比较熟悉的话,可以考虑yql。

>>QueryPath, php上的jQuery

-----------------------------------------------------

在网页采集的时候,通常都会用到正则表达式。但是有时候对于正则不太好的同学,比如我,那就杯具了。。如今google的项目里有个phpQuery , 顾名思义query,完全类似于jquery的语法,但这是服务器端的,总体来说就是可以用php来直接采集对应的网页内容了,真的是太方便了,  它让一切变得可能......

phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library.

Library is written in PHP5 and provides additional Command Line Interface (CLI).

项目下载地址:http://code.google.com/p/phpquery/

如果你使用过jQuery,你会发现这一切是如此的相象。

如何快速方便的获取到网页的 title?


© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 21
码字总数 13002
作品 0
广州
私信 提问
加载中

评论(13)

Crazy罗小杰
Crazy罗小杰
这个牛逼啊,哈哈。
谢锡鹏

引用来自“newnoder”的评论

爬虫利器?
确实是比较方便处理的。
谢锡鹏

引用来自“卖小女孩的小火柴”的评论

半年前用的http://simplehtmldom.sourceforge.net/做的半自动采集,效果还可以
这个方法我也有试过,要获取到目标数据比较多步骤。你有例子吗?
谢锡鹏

引用来自“完美神话”的评论

昨晚,就看了一个标题,然后就睡了,睡前就猜想,phpquery干啥,果然,和我想的一样,jquery在服务端的实现确实很方便。
是的
谢锡鹏

引用来自“九黎后人”的评论

我记得是可以使用正则的,半年前还用它来采集数据
有没有例子可以分享一下?服务端的解析方法远没有jquery 获取到的数据方便准确。不过这个方法已经是比较简便的了!
n
newnoder
爬虫利器?
卖小女孩的小火柴
卖小女孩的小火柴
半年前用的http://simplehtmldom.sourceforge.net/做的半自动采集,效果还可以
sirocco
sirocco
最好搞个对比,语法简单不能说明处理速度,毕竟封装太深。
完美神话
完美神话
昨晚,就看了一个标题,然后就睡了,睡前就猜想,phpquery干啥,果然,和我想的一样,jquery在服务端的实现确实很方便。
子弹兄
子弹兄
貌似不错!
使用phpQuery轻松采集网页内容

phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容,比如获取某新闻网站的头条信息。更有意思的是,它采用了jQuery的思想,你可以像使用jQuery一样处理页面内...

Minho
2012/02/08
0
0
php或者nodejs。python等解析dom的库

请教各位解析html的工具包。。 比如node.js可以加载jquery来解析html php有phpquery的工具包可以使用类似jquery的语法来解析html yql:yahoo的解析html的一个接口,通过类似sql的语法来解析h...

实习导演
2014/09/27
456
5
phpquery中的each怎么用??

想知道phpquery中each怎么用,我这么写 echo pq("article")->each("Welcome::test","title"); 返回的是整个对象。 当然,用foreach也可以实现,但还是想了解下,看phpquery这部分代码,没看懂......

rihgtzhao
2015/07/17
824
4
phpQuery使用DOMDocument::loadHTML方法产生报错的处理方式

发现问题 在做爬虫的时候,用了QueryList,在运行的过程中查看日志,出现很多关于phpQuery单文件的error报错,问题是出在html非标准化格式 解决问题 在查看关于类方法的使用的时候,发现可以...

贤郎--Querying
2018/07/27
0
0
问个phpQuery采集的问题

@李飞麟 你好,想请教个phpQuery的问题。 我用phpQuery采集糗事百科首页的内容,代码如下 phpQuery::newDocumentFile('http://qiushibaike.com'); $art = pq('.block'); foreach($art as $t......

amonxu
2013/10/15
655
3

没有更多内容

加载失败,请刷新页面

加载更多

关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
29分钟前
0
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
15
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
5
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部