Symfony 使用xpath对html进行子筛选
我怀疑实现这一目标的最佳途径。我正在使用Symfony Crawler,我有这个过滤器:Symfony 使用xpath对html进行子筛选,symfony,xpath,web-crawler,Symfony,Xpath,Web Crawler,我怀疑实现这一目标的最佳途径。我正在使用Symfony Crawler,我有这个过滤器: $myData = $crawler->filterXPath('//div[@class="container"]'); 然后我像这样绕着它们转: foreach ($myData as $domElementData) { <div class="container1234Y53"> <div id="date12345">12/02/2014</
$myData = $crawler->filterXPath('//div[@class="container"]');
然后我像这样绕着它们转:
foreach ($myData as $domElementData) {
<div class="container1234Y53">
<div id="date12345">12/02/2014</div>
<div id="price">80£</div>
<div id="numberofpeople">4</div>
</div>
<div class="container1234X123">
<div id="date3451">2/06/2014</div>
<div id="price">30£</div>
<div id="numberofpeople">1</div>
</div>
....
container[0]['date'] = 12/02/2014
container[0]['price'] = 80
container[0]['numberofpeople'] = 4
container[1]['date'] = 2/06/2014
container[1]['price'] = 30
container[1]['numberofpeople'] = 1
....
但是使用divFirst,我得到一个带有链接的块,div。。。我需要为每个块过滤并放入一个数组。我的第一种方法是在每个块上循环(divFirst),然后是子过滤器,但我不确定是否应该为此创建第二个子过滤器
另一种选择是采取如下措施:
$subData1 = $crawler->filterXPath('//*[contains(@id, "date")]');
$subData2 = $crawler->filterXPath('//*[contains(@id, "price")]');
...
然后循环第一个并使用其索引在第一个数组中包含fest字段的所有信息
foreach (subData1 as $index=>$subData) {
$theFinalData [$index]['subdata1'] = subData1;
$theFinalData [$index]['subdata2'] = subData2;
...
但这最后一个选择似乎很奇怪,甚至很丑陋。有什么意见吗
我试图阅读的html如下所示:
foreach ($myData as $domElementData) {
<div class="container1234Y53">
<div id="date12345">12/02/2014</div>
<div id="price">80£</div>
<div id="numberofpeople">4</div>
</div>
<div class="container1234X123">
<div id="date3451">2/06/2014</div>
<div id="price">30£</div>
<div id="numberofpeople">1</div>
</div>
....
container[0]['date'] = 12/02/2014
container[0]['price'] = 80
container[0]['numberofpeople'] = 4
container[1]['date'] = 2/06/2014
container[1]['price'] = 30
container[1]['numberofpeople'] = 1
....
事先非常感谢。经过一些研究,我回答了自己的问题,希望它能帮助其他人 您必须创建一个新的爬虫程序,如下所述: 基本上,第一个将搜索第一组:
// crate crawler instance from body HTML code
$crawler = new Crawler($response->getBody(true));
// apply css selector filter
$myData = $crawler->filterXPath('//div[@class="container"]');
$result = array();
然后,您可以迭代搜索结果,创建一个新的爬网程序,并使用此新爬网程序提取此新搜索的结果:
// iterate over filter results
foreach ($myData as $i => $content) {
// create crawler instance for result
$cralwer = new Crawler($content);
// extract the values needed
$result[$i] = array(
'topic' => $crawler->filterXPath('//*[contains(@id, "date")]')->text();
...
我不确定(现在仍然是)这是否是性能方面的最佳解决方案,因为爬虫程序创建了好几次,但在编码样式方面似乎比第一个解决方案要好。问题可能更像是,如何使用Symfony crawler获取节点中的每个元素?可能还有其他(更简单)的替代方案。显示您的XML文件并准确解释您想要提取的内容。是的,您完全正确。它不是xml而是html,只是用一个示例更新了原始帖子。再次感谢:-)。在源代码示例中,
divFirst
在哪里?它在包装那些节点吗?你想提取什么?整个容器
节点?date
或price
字符串的集合?理想情况下,一个由n个元素组成的数组,其中包含数组中的每个元素日期、数字等。。。