DomCrawler组件

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

DomCrawler组件

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

请注意

同时,DomCrawler组件不是用于操纵DOM或re-dumping HTML / XML。

安装

您可以安装组件在两个不同的方面:

然后,需要供应商/ autoload.php文件,使作曲家提供的半自动的机制。否则,您的应用程序无法找到这个Symfony组件的类。ob娱乐下载

使用

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

履带的实例代表一组(SplObjectStorage)DOMElement对象,这基本上是节点,您可以轻松地遍历:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\DomCrawler\履带;美元html=< < <“HTML”< !DOCTYPE html > < html > <身体> < p class = "消息" > Hello World !< / p > < p >你好履带!< /p>   HTML;< /span>美元履带=履带(美元html);foreach(美元履带作为美元domElement{var_dump ()美元domElement- >节点名);}

专业链接形式类是用于与html链接和表单交互树遍历html。

请注意

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

节点过滤

使用XPath表达式非常简单:

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

提示

DOMXPath:查询内部使用,实际执行XPath查询。

过滤甚至更容易如果你有CssSelector组件安装。这允许您使用jQuery-like选择器来遍历:

1
美元履带=美元履带- >过滤器(“身体> p”);

匿名函数可以用来过滤与更复杂的标准:

1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\DomCrawler\履带;/ /……美元履带=美元履带- >过滤器(“身体> p”)- >减少(函数(履带美元节点,美元){/ /过滤甚至节点返回(美元%2)= =0;});

删除一个节点匿名函数必须返回false。

请注意

所有过滤方法返回一个新的履带实例与过滤内容。

这两个filterXPath ()filter ()方法使用XML名称空间,可以显式地自动发现或注册。

考虑下面的XML:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><条目xmlns=“http://www.w3.org/2005/Atom”xmlns:媒体=“http://search.yahoo.com/mrss/”xmlns:欧美=“http://gdata.youtube.com/schemas/2007”><id>标签:youtube.com, 2008:视频:kgZRZmEc9j4< /id><欧美accessControl行动=“评论”许可=“允许”/ ><欧美accessControl行动=“videoRespond”许可=“主持”/ ><媒体:组><媒体:标题类型=“普通”>脊索动物——CrashCourse生物学# 24< /媒体:标题><欧美aspectRatio>宽屏< /欧美aspectRatio>< /媒体:组>< /条目>

这可以过滤的履带无需注册与命名空间别名filterXPath ():

1
美元履带=美元履带- >filterXPath (' / /默认值:输入/媒体:集团/ /欧美aspectRatio”);

filter ():

1 2 3 4
使用ob娱乐下载\组件\CssSelector\CssSelector;CssSelector::disableHtmlExtension ();美元履带=美元履带- >过滤器(“默认媒体| |条目组次| aspectRatio”);

请注意

默认名称空间前缀“默认”注册。它可以改变setDefaultNamespacePrefix ()方法。

删除默认名称空间时加载的内容如果是唯一的名称空间的文档。为了简化xpath查询。

可以显式地注册的名称空间registerNamespace ()方法:

1 2
美元履带- >registerNamespace (“米”,“http://search.yahoo.com/mrss/”);美元履带=美元履带- >filterXPath (' / / m: / /欧美aspectRatio”);

谨慎

与一个CSS选择器查询XML, HTML扩展需要被禁用CssSelector: disableHtmlExtension避免将选择器转换为小写。

节点遍历

访问节点的位置列表:

1
美元履带- >过滤器(“身体> p”)- >eq (0);

获得第一个或最后一个节点当前的选择:

1 2
美元履带- >过滤器(“身体> p”)- >第();美元履带- >过滤器(“身体> p”)- >最后();

得到相同级别的节点作为当前的选择:

1
美元履带- >过滤器(“身体> p”)- >兄弟姐妹();

得到相同的级别节点之前或之后进行当前的选择:

1 2
美元履带- >过滤器(“身体> p”)- >nextAll ();美元履带- >过滤器(“身体> p”)- >previousAll ();

让所有的孩子或父节点:

1 2
美元履带- >过滤器(“身体”)- >孩子();美元履带- >过滤器(“身体> p”)- >父母();

请注意

所有的遍历方法返回一个新的履带实例。

访问节点值

2.6

节点名()方法是在Symfony 2.6中引入的。ob娱乐下载

访问节点名(HTML标记名称)的第一个节点(如当前的选择。" p "或" div "):

1 2
/ /将返回节点名(HTML标签名称)下的第一个子元素<身体>美元标签=美元履带- >filterXPath (' / /身体/ *)- >节点名();

访问当前选择的第一个节点的值:

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字符集,总是添加HTML内容使用addHTMLContent ()方法,您可以指定第二个参数是目标字符集。

爬虫的实现是基于DOM扩展,它也能够与本地交互DOMDocument,DOMNodeListDOMNode对象:

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
美元html=;foreach(美元履带作为美元domElement){美元html。=美元domElement- >ownerDocument- >saveHTML (美元domElement);}

或者你可以得到第一个节点使用的HTMLhtml ():

1
美元html=美元履带- >html ();

html方法是新的在Symfony 2.3ob娱乐下载。

谨慎

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

找到一个链接的名字(或者一个可点击的形象alt属性),使用selectLink方法对现有的爬虫。这返回一个履带实例只有选定的链接(s)。调用链接()给你一个特殊的链接对象:

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 (“验证”)- >形式(数组(“名字”= >“瑞恩”));

形式对象有很多非常有用的方法来处理形式:

1 2 3
美元uri=美元形式- >getUri ();美元方法=美元形式- >getMethod ();

getUri ()方法只是返回行动属性的形式。如果表单方法得到,那么模仿并返回浏览器的行为行动属性,后跟一个查询字符串的所有表单的值。

实际上你可以设置和获取值的形式:

1 2 3 4 5 6 7 8 9 10 11 12
/ /设置表单上的内部值美元形式- >setvalue (数组(“登记【用户名】”= >“ob娱乐下载symfonyfan”,“登记(术语)”= >1));/ /返回一个数组的值——在上面的“平”阵列像美元=美元形式- >getvalue ();/ /返回值像PHP会看到他们,/ /在“登记”是自己的数组美元=美元形式- >getPhpValues ();

使用多维领域:

1 2 3 4 5
输入name = <形> <“多[]”/ > < =输入的名字“多[]”/ > < =输入的名字“多(维)”/ > < /形式>

通过一个数组的值:

1 2 3 4 5 6 7 8
/ /设置一个字段美元形式- >setvalue (数组(“多”= >数组(“价值”)));/ /设置多个字段美元形式- >setvalue (数组(“多”= >数组(1= >“价值”,“维”= >“一个其他值”)));

这是伟大的,但是它变得更好!的形式对象允许您与形式像浏览器交互,选择电台价值观,定时复选框和上传文件:

1 2 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客户端和使用这些信息

一个很好的例子,使用所有的这些都是一个完整的系统Goutte。Goutte理解Symfony爬虫对象,可以用ob娱乐下载它直接提交表单:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用Goutte\客户端;/ /做一个真正的请求到外部网站美元客户端=客户端();美元履带=美元客户端- >请求(“得到”,“https://github.com/login”);/ /选择表单,填写一些值美元形式=美元履带- >selectButton (“登录”)- >形式();美元形式(“登录”]=“ob娱乐下载symfonyfan”;美元形式(“密码”]=“anypass”;/ /提交表单美元履带=美元客户端- >提交(美元形式);

选择无效的选择值

默认情况下,选择字段(选择、广播)内部验证激活阻止你设置无效的值。如果你希望能够设置无效的值,您可以使用disableValidation ()方法在整个表单或特定字段(s):

1 2 3 4 5 6
/ /禁用验证为一个特定的领域美元形式(“国家”]- >disableValidation ()- >选择(“无效的价值”);/ /禁用验证整个形式美元形式- >disableValidation ();美元形式(“国家”]- >选择(“无效的价值”);
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。