在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用数组返回无限分类的列表数据的代码
Aug 08 PHP
php学习之数据类型之间的转换介绍
Jun 09 PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
Yii配置文件用法详解
Dec 04 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
PHP随机数 C扩展随机数
May 04 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
php实现的中文分词类完整实例
Feb 06 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
JS实现的A*寻路算法详解
2018/12/14 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
python实现微信小程序自动回复
2018/09/10 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
五年级英语教学反思
2014/01/31 职场文书
个人担保书格式范文
2014/05/12 职场文书
主题班会演讲稿
2014/05/22 职场文书
食品安全处置方案
2014/06/14 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python