在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
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 PHP
php Mysql日期和时间函数集合
Nov 16 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
Nov 12 PHP
php判断当前操作系统类型
Oct 28 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
详解WordPress中简码格式标签编写的基本方法
Dec 22 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
php 多继承的几种常见实现方法示例
Nov 18 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 定界符 使用技巧
2009/06/14 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
JavaScript中的null和undefined解析
2012/04/14 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
SQL面试题
2013/04/30 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
农场厂长岗位职责
2013/12/28 职场文书
优秀士兵个人事迹材料
2014/01/19 职场文书
护士自我鉴定怎么写
2014/02/07 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
网络营销计划
2015/01/17 职场文书
十七岁的单车观后感
2015/06/12 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL