Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 使用xpath对html进行子筛选_Symfony_Xpath_Web Crawler - Fatal编程技术网

Symfony 使用xpath对html进行子筛选

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</

我怀疑实现这一目标的最佳途径。我正在使用Symfony Crawler,我有这个过滤器:

$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个元素组成的数组,其中包含数组中的每个元素日期、数字等。。。