DomCrawler组件

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

DomCrawler组件

DomCrawler组件简化了HTML和XML文档的DOM导航。

请注意

尽管有可能,但DomCrawler组件并不是为操纵DOM或重新转储HTML/XML而设计的。

安装

你可以用两种不同的方式安装组件:

然后,要求供应商/ autoload.php文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。ob娱乐下载

使用

履带类提供了查询和操作HTML和XML文档的方法。

爬虫程序的实例表示一组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) {var_dump(domElement->节点名);}

专业链接而且形式类对于遍历html树时与html链接和表单交互非常有用。

请注意

DomCrawler将尝试自动修复您的HTML以匹配官方规范。例如,如果你嵌套一个< p >标签在另一个里面< p >标签,它将被移动到父标签的兄弟姐妹。这是预期的,也是HTML5规范的一部分。但如果你得到了意想不到的行为,这可能是一个原因。虽然DomCrawler并不意味着转储内容,但你可以通过它看到HTML的“固定”版本倾销它

节点过滤

使用XPath表达式非常简单:

1
履带履带->filterXPath (“子轴或self::阀体/ p”);

提示

DOMXPath:查询在内部实际执行XPath查询。

如果你安装了CssSelector组件,筛选就更容易了。这允许你使用类似jquery的选择器来遍历:

1
履带履带->过滤器('body > p');

匿名函数可以用来过滤更复杂的条件:

1 2 3 4 5 6 7 8 9
使用ob娱乐下载组件DomCrawler履带/ /……履带履带->过滤器('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 4 5 6
使用ob娱乐下载组件DomCrawler履带/ /……nodeValues履带->过滤器(“p”->每个(函数(履带节点,返回节点->文本();});

2.3

如图所示,在Symfony 2.3ob娱乐下载中每一个而且减少闭包函数被传递履带作为第一个参数。之前,这个论点是DOMNode

匿名函数接收节点(作为爬虫)和位置作为参数。结果是匿名函数调用返回的值数组。

添加内容

爬虫支持多种方式添加内容:

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,DOMNodeDOMDocument.例如,您可以获得的HTML履带就像这样:

1 2 3 4 5
超文本标记语言foreach履带作为domElement) {超文本标记语言.=domElement->ownerDocument->saveHTML (domElement);}

或者,您可以使用html ()

1
超文本标记语言履带->html ();

超文本标记语言方法是Symfony 2.3中的新ob娱乐下载方法。

谨慎

由于PHP中的一个问题,html ()方法在低于5.3.6的PHP版本中返回错误解码的HTML实体(例如,它返回而不是牛;).

按名称查找链接(或按名称查找可点击图像)alt属性),使用selectLink方法。这将返回一个仅包含所选链接的Crawler实例。调用链接()给你一个特别的链接对象:

1 2 3 4 5
linksCrawler履带->selectLink (“去别处……”);链接linksCrawler->链接();//或者一次执行所有这些操作链接履带->selectLink (“去别处……”->链接();

链接对象有几个有用的方法来获取有关所选链接本身的更多信息:

1 2
//返回可用于发出另一个请求的正确URIuri链接->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”//提交表单履带客户端->提交(形式);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。