在laravel中使用Symfony的Crawler组件分析HTML


Posted in PHP onJune 19, 2017

Crawler全名是DomCrawler,是Symfony框架的组件。令人发指的是DomCrawler的没有中文文档,Symfony也没有翻译该部分,所以使用DomCrawler开发只能一点一点摸索,现将使用过程中的经验总结。

首先是安装

composer require symfony/dom-crawler
composer require symfony/css-selector

css-seelctor 是 css选择器,用css选择节点时一些函数会用到

手册里面使用的例子是

use Symfony\Component\DomCrawler\Crawler;
$html = <<<‘HTML‘
Hello World!
Hello Crawler!
HTML;
$crawler = new Crawler($html);
foreach ($crawler as $domElement)
{
var_dump($domElement->nodeName);
}

打印的结果是

string ‘html‘ (length=4)

因为这段html代码的nodeName就是html,英语不好,开始使用的时候还以为程序错了。。。

实际使用过程,如果new Crawler($html)会出现乱码问题,应该是与页面编码有关,所以可以采用下面的方式,先初始化crawler,然后添加node

$crawler = new Crawler();
$crawler->addHtmlContent($html);

addHtmlContent的第二个参数是charset,默认是utf-8。

其他例子可以参考官方文档,http://symfony.com/doc/current/components/dom_crawler.html

记录一下工作中一点点试出来的用法

filterXPath(string $xpath) 方法,按照手册上的说法,该方法的参数是$xpath,经常用的是p,div等块。

echo $crawler->filterXPath(‘//body/p‘)->text();
echo $crawler->filterXPath(‘//body/p‘)->last()->text();

输出是第一个和下一个p标签块的文本

var_dump($crawler->filterXPath(‘//body‘)->html());

输出body内的html

foreach ($crawler->filterXPath(‘//body/p‘) as $i => $node) {
$c = new Crawler($node);
echo $c->filter(‘p‘)->text();
}

filterXPath获得的是DOMElement块的数组,每个DOMElement块可以使用新的crawler对象继续解析

$nodeValues =
$crawler->filterXPath(‘//body/p‘)->each(function (Crawler $node, $i) {
return $node->text();
});

crawler提供了each循环,使用闭包函数简化代码,不过注意的是,这种写法$nodeValues得到的是数组,需要进一步处理。

其他用法

echo $crawler->filterXPath(‘//body/p‘)->attr(‘class‘);

可以获得第一个p标签对应class属性的值“message”

$crawler->filterXPath(‘//div[@class="样式"]‘)->filter(‘a‘)->attr(‘href‘);
$crawler->filterXPath(‘//div[@class="样式"]‘)->filter(‘a>img‘)->extract(array(‘alt‘, ‘href‘))

以上是获得标签属性的一些方法

filter和filterXPath不同,手册上写的是css选择器,不太明白,我理解是div这种XPath节点包含的元素,具体情况还需要在实际开发中去尝试。

总的来说感觉DomCrawler要比simple html dom好用一些,可能是我用的比较浅显。

上述只是Crawler的基本功能,更过用法请查阅symfony手册关于Crawler部分的函数

http://api.symfony.com/3.2/Symfony/Component/DomCrawler/Crawler.html

Crawler主要问题还是示例太少,函数手册里面没有使用实例,只能在实际使用中去摸索。。。。

symfony关于DomCrawler的文档,里面有少数例子

http://symfony.com/doc/current/components/dom_crawler.html

以上所述是小编给大家介绍的在laravel中使用Symfony的Crawler组件分析HTML,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP数据库操作面向对象的优点
Oct 09 PHP
基于mysql的论坛(5)
Oct 09 PHP
php 图像函数大举例(非原创)
Jun 20 PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
php轻松实现中英文混排字符串截取
May 28 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
php实现微信扫码自动登陆与注册功能
Sep 22 PHP
yii框架搜索分页modle写法
Dec 19 PHP
php中的explode()函数实例介绍
Jan 18 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
详解PHP Swoole与TCP三次握手
May 27 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 #PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 #PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 #PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 #PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 #PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 #PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 #PHP
You might like
PHP音乐采集(部分代码)
2007/02/14 PHP
一个图形显示IP的PHP程序代码
2007/10/19 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
PHP实现的json类实例
2015/07/28 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
python如何在循环引用中管理内存
2018/03/20 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
德国机车企业:FC-Moto
2017/10/27 全球购物
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
动员大会主持词
2014/03/20 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
田径运动会广播稿
2015/08/19 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers