在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读取数据库信息的几种方法
May 24 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
php+redis消息队列实现抢购功能
Feb 08 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 正则 过滤html 的超链接
2009/06/02 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
Python设计模式之单例模式实例
2014/04/26 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
python super的使用方法及实例详解
2019/09/25 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
c++工程师面试问题
2013/08/04 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
会议接待欢迎词
2014/01/12 职场文书
技能比赛获奖感言
2014/02/14 职场文书
经济国贸专业求职信
2014/06/18 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
民间借贷被告代理词
2015/05/23 职场文书