DomCrawler组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
DomCrawler组件
DomCrawler组件简化了HTML和XML文档的DOM导航。
请注意
尽管有可能,但DomCrawler组件并不是为操纵DOM或重新转储HTML/XML而设计的。
安装
你可以用很多不同的方式安装组件:
- 使用官方Git存储库(https://github.com/ob娱乐下载symfony/DomCrawler);
- 通过Composer安装(
ob娱乐下载symfony / dom-crawler
在Packagist).
使用
的履带类提供了查询和操作HTML和XML文档的方法。
爬虫的实例表示一个集合(SplObjectStorage)DOMElement对象,它们基本上是你可以轻松遍历的节点:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\DomCrawler\履带;$超文本标记语言=< < <“HTML”< !DOCTYPE html> Hello World!
Hello Crawler!
html;$履带=新履带($超文本标记语言);foreach($履带作为$domElement) {打印$domElement->节点名;}
专业链接而且形式类对于遍历html树时与html链接和表单交互非常有用。
节点过滤
使用XPath表达式非常简单:
1
$履带=$履带->filterXPath (“子轴或self::阀体/ p”);
提示
DOMXPath:查询
在内部实际执行XPath查询。
如果您有CssSelector
组件安装。这允许你使用类似jquery的选择器来遍历:
1
$履带=$履带->过滤器('body > p');
匿名函数可以用来过滤更复杂的条件:
1 2 3 4
$履带=$履带->过滤器('body > p')->减少(函数($节点,$我){//过滤偶数节点返回($我%2) = =0;});
要移除一个节点,匿名函数必须返回false。
请注意
所有筛选器方法都返回一个new履带实例,使用过滤后的内容。
节点遍历
按其在列表中的位置划分接入节点:
1
$履带->过滤器('body > p')->eq (0);
获取当前选择的第一个或最后一个节点:
1 2
$履带->过滤器('body > p')->第();$履带->过滤器('body > p')->最后();
获取与当前选择的节点同级的节点:
1
$履带->过滤器('body > p')->兄弟姐妹();
在当前选择之后或之前获得相同级别的节点:
1 2
$履带->过滤器('body > p')->nextAll ();$履带->过滤器('body > p')->previousAll ();
获取所有子节点或父节点:
1 2
$履带->过滤器(“身体”)->孩子();$履带->过滤器('body > p')->父母();
请注意
所有遍历方法都返回一个new履带实例。
访问节点值
访问当前选择的第一个节点的值:
1
$消息=$履带->filterXPath (' / /身体/ p ')->文本();
访问当前选择的第一个节点的属性值:
1
$类=$履带->filterXPath (' / /身体/ p ')->attr (“类”);
从节点列表中提取属性和/或节点值:
1 2 3 4
$属性=$履带->filterXpath (' / /身体/ p ')->提取(数组(“_text”,“类”));
请注意
特殊的属性_text
表示节点值。
在列表的每个节点上调用一个匿名函数:
1 2 3
$nodeValues=$履带->过滤器(“p”)->每个(函数($节点,$我){返回$节点->文本();});
匿名函数接收位置和节点作为参数。结果是匿名函数调用返回的值数组。
添加内容
爬虫支持多种方式添加内容:
1 2 3 4 5 6 7 8 9 10
$履带=新履带(身体的< html > < / > < / html >”);$履带->addHtmlContent (身体的< html > < / > < / html >”);$履带->addXmlContent (' <根> <节点/ >根> < /”);$履带->addContent (身体的< html > < / > < / html >”);$履带->addContent (' <根> <节点/ >根> < /”,“text / xml”);$履带->add (身体的< html > < / > < / html >”);$履带->add (' <根> <节点/ >根> < /”);
请注意
处理ISO-8859-1以外的字符集时,始终使用addHTMLContent ()方法,其中可以将第二个参数指定为目标字符集。
由于爬虫的实现是基于DOM扩展的,所以它也能够与本机交互DOMDocument,DOMNodeList而且DOMNode对象:
1 2 3 4 5 6 7 8 9 10
$文档=新\ DOMDocument ();$文档->loadXml (' ');$节点列表=$文档->getElementsByTagName (“节点”);$节点=$文档->getElementsByTagName (“节点”)->项目(0);$履带->addDocument ($文档);$履带->addNodeList ($节点列表);$履带->addnode (数组($节点));$履带->addNode ($节点);$履带->add ($文档);
操纵和倾倒履带
这些方法履带
最初打算填充您的履带
并且不打算用于进一步操作DOM(尽管这是可能的)。然而,自从履带
是一套DOMElement对象上可用的任何方法或属性DOMElement,DOMNode或DOMDocument.例如,您可以获得的HTML履带
就像这样:
1 2 3 4 5
$超文本标记语言=”;foreach($履带作为$domElement) {$超文本标记语言.=$domElement->ownerDocument->saveHTML ($domElement);}
表单和链接支持
对DOM树中的链接和表单进行了特殊处理。
链接
按名称查找链接(或按名称查找可点击图像)alt
属性),使用selectLink
方法。这将返回一个仅包含所选链接的Crawler实例。调用链接()
给你一个特别的链接对象:
1 2 3 4 5
$linksCrawler=$履带->selectLink (“去别处……”);$链接=$linksCrawler->链接();//或者一次执行所有这些操作$链接=$履带->selectLink (“去别处……”)->链接();
的链接对象有几个有用的方法来获取有关所选链接本身的更多信息:
1 2
//返回可用于发出另一个请求的正确URI$uri=$链接->getUri ();
请注意
的getUri ()
特别有用,因为它能清洁href
重视并将其转化为真正应该处理的方式。例如,与的链接href = " # foo”
,这将返回当前页面的完整URI# foo
.从getUri ()
始终是一个完整的URI,您可以对其进行操作。
形式
对表单也给予特殊处理。一个selectButton ()
方法在爬虫上可用,该爬虫返回另一个匹配按钮的爬虫(输入(type =提交)
,输入(type =图像)
,或按钮
)。此方法特别有用,因为您可以使用它返回形式对象,该对象表示按钮所在的表单:
1 2 3 4 5 6
$形式=$履带->selectButton (“验证”)->形式();//或用数据“填充”表单字段$形式=$履带->selectButton (“验证”)->形式(数组(“名字”= >“瑞恩”));
的形式Object有很多非常有用的方法来处理表单:
1 2 3
$uri=$形式->getUri ();$方法=$形式->getMethod ();
的getUri ()方法所做的不仅仅是返回行动
表单的属性。如果表单方法是GET,那么它将模拟浏览器的行为并返回行动
属性,然后是包含所有表单值的查询字符串。
你可以在表单上虚拟设置和获取值:
12 3 4 5 6 7 8 9 10 11 12
//在表单内部设置值$形式->setvalue (数组(“登记【用户名】”= >“ob娱乐下载symfonyfan”,“登记(术语)”= >1));//返回一个值的数组-在"flat"数组中,如上面所示$值=$形式->getvalue ();//返回PHP会看到的值,//其中registration是它自己的数组$值=$形式->getPhpValues ();
处理多维字段:
1 2 3 4 5
传递一个值数组:
1 2 3 4 5 6 7 8
//设置单个字段$形式->setvalue (数组(“多”= >数组(“价值”)));//同时设置多个字段$形式->setvalue (数组(“多”= >数组(1= >“价值”,“维”= >“另一个价值”)));
这很棒,但还有更好的!的形式
对象允许您像浏览器一样与您的表单交互,选择单选值,勾选复选框,并上传文件:
12 3 4 5 6 7 8 9 10 11 12 13 14
$形式[“登记【用户名】”]->setValue (“ob娱乐下载symfonyfan”);//选中或取消选中复选框$形式[“登记(术语)”]->蜱虫();$形式[“登记(术语)”]->取消勾选();//选择一个选项$形式[的登记(生日)(年)]->选择(1984);//从多个选择或复选框中选择多个选项$形式[“登记(利益)”]->选择(数组(sob娱乐下载ymfony的,“饼干”));//甚至伪造文件上传$形式[“登记(图)”]->上传(“/道路/ / lucas.jpg”);
做这些有什么意义?如果你在内部测试,你可以从你的表单中获取信息,就像它刚刚被提交一样,使用PHP值:
1 2
$值=$形式->getPhpValues ();$文件=$形式->getPhpFiles ();
如果你正在使用外部HTTP客户端,你可以使用表单获取所有你需要为表单创建POST请求的信息:
1 2 3 4 5 6
$uri=$形式->getUri ();$方法=$形式->getMethod ();$值=$形式->getvalue ();$文件=$形式->getfile ();//现在使用一些HTTP客户端和post使用这些信息
使用所有这些的集成系统的一个很好的例子是Goutte.Goutte理解Symfony爬虫对象,可以使ob娱乐下载用它直接提交表单:
12 3 4 5 6 7 8 9 10 11 12 13
使用Goutte\客户端;//向外部站点发出真正的请求$客户端=新客户端();$履带=$客户端->请求(“得到”,“https://github.com/login”);//选择表单并填写一些值$形式=$履带->selectButton (“登录”)->形式();$形式[“登录”] =“ob娱乐下载symfonyfan”;$形式[“密码”] =“anypass”;//提交表单$履带=$客户端->提交($形式);