DomCrawler组件
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.2,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
DomCrawler组件
DomCrawler组件简化了DOM HTML和XML文档的导航。
请注意
同时,DomCrawler组件不是用于操纵DOM或re-dumping HTML / XML。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
欧宝娱乐app下载地址symfony / dom-crawler
在Packagist); - 使用官方的Git存储库(https://github.com/欧宝娱乐app下载地址symfony/DomCrawler)。
使用
的履带类提供了方法来查询和操纵HTML和XML文档。
履带的实例代表一组(SplObjectStorage)DOMElement对象,这基本上是节点,您可以轻松地遍历:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用欧宝娱乐app下载地址\组件\DomCrawler\履带;美元html=< < <“HTML”< !DOCTYPE html > < html > <身体> < p class = "消息" > Hello World !< / p > < p >你好履带!< / p > < /身体> < / html > html;美元履带=新履带(美元html);foreach(美元履带作为美元domElement){打印美元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
美元履带=美元履带- >过滤器(“身体> p”)- >减少(函数(美元节点,美元我){/ /过滤甚至节点返回(美元我%2)= =0;});
删除一个节点匿名函数必须返回false。
请注意
所有过滤方法返回一个新的履带实例与过滤内容。
节点遍历
访问节点的位置列表:
1
美元履带- >过滤器(“身体> p”)- >eq (0);
获得第一个或最后一个节点当前的选择:
1 2
美元履带- >过滤器(“身体> p”)- >第();美元履带- >过滤器(“身体> p”)- >最后();
得到相同级别的节点作为当前的选择:
1
美元履带- >过滤器(“身体> p”)- >兄弟姐妹();
得到相同的级别节点之前或之后进行当前的选择:
1 2
美元履带- >过滤器(“身体> p”)- >nextAll ();美元履带- >过滤器(“身体> p”)- >previousAll ();
让所有的孩子或父节点:
1 2
美元履带- >过滤器(“身体”)- >孩子();美元履带- >过滤器(“身体> p”)- >父母();
请注意
所有的遍历方法返回一个新的履带实例。
访问节点值
访问当前选择的第一个节点的值:
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字符集,总是添加HTML内容使用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 (美元文档);
链接
找到一个链接的名字(或者一个可点击的形象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 (数组(“登记【用户名】”= >“欧宝娱乐app下载地址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 (“欧宝娱乐app下载地址symfonyfan”);/ /选中或取消选择复选框美元形式(“登记(术语)”]- >蜱虫();美元形式(“登记(术语)”]- >取消勾选();/ /选择一个选项美元形式(的登记(生日)(年)]- >选择(1984年);/ /选择许多选项从“多个”选择美元形式(“登记(利益)”]- >选择(数组(s欧宝娱乐app下载地址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爬虫对象,可以用欧宝娱乐app下载地址它直接提交表单:
1 2 3 4 5 6 7 8 9 10 11 12 13
使用Goutte\客户端;/ /做一个真正的请求到外部网站美元客户端=新客户端();美元履带=美元客户端- >请求(“得到”,“https://github.com/login”);/ /选择表单,填写一些值美元形式=美元履带- >selectButton (“登录”)- >形式();美元形式(“登录”]=“欧宝娱乐app下载地址symfonyfan”;美元形式(“密码”]=“anypass”;/ /提交表单美元履带=美元客户端- >提交(美元形式);