我对实现这一目标的最佳方法表示怀疑。我正在使用Symfony Crawler,并且具有以下过滤器:
$myData = $crawler->filterXPath('//div[@class="container"]');
然后我像这样循环遍历它们:
foreach ($myData as $domElementData) {
但是使用divFirst,我得到了一个包含链接,div,...的块,我需要对其进行过滤并将其放入每个块的数组中。我的第一种方法是循环遍历每个块(divFirst),然后遍历子过滤器,但是我不确定是否应该为此创建第二个子爬网程序吗?
另一种选择是做类似的事情:
$subData1 = $crawler->filterXPath('//*[contains(@id, "date")]');
$subData2 = $crawler->filterXPath('//*[contains(@id, "price")]');
...
然后循环第一个,并使用其索引将所有字段节的信息包括在第一个数组中?
foreach (subData1 as $index=>$subData) {
$theFinalData [$index]['subdata1'] = subData1;
$theFinalData [$index]['subdata2'] = subData2;
...
但是,这最后的选择似乎很奇怪,甚至很难看。有什么意见吗?
我尝试读取的html看起来像这样:
<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
....
在此先多谢。
经过研究,我回答自己希望它能对其他人有所帮助。
您必须创建一个新的Crawler,详细信息如下:http : //www.ymc.ch/en/webscraping-in-php-with-guzzle-http-and-symfony-domcrawler
基本上,第一个将搜索第一组:
// 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();
...
我不确定(仍然是)就爬网性能而言,这是否是最佳的性能解决方案,因为它多次创建,但在编码样式方面似乎比第一个解决方案要好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句