使用xpath子过滤html

亚历杭德罗·莫雷诺(Alejandro Moreno)

我对实现这一目标的最佳方法表示怀疑。我正在使用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
....

在此先多谢。

亚历杭德罗·莫雷诺(Alejandro Moreno)

经过研究,我回答自己希望它能对其他人有所帮助。

您必须创建一个新的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用XPath for HTML获取子节点的数量?

来自分类Dev

如何使用XPath for HTML获取子节点的数量?

来自分类Dev

R:使用xpath过滤节点

来自分类Dev

使用XPATH进行JMS过滤

来自分类Dev

使用RxJava过滤子列表

来自分类Dev

如何在事件查看器中使用Xpath来过滤属性值的子字符串?

来自分类Dev

使用XPath按多个值过滤

来自分类Dev

在PHP中使用xpath过滤XML属性

来自分类Dev

使用XPath和PHP过滤XML文档

来自分类Dev

如何使用XPath检查子元素的位置

来自分类Dev

使用XPATH子字符串函数

来自分类Dev

使用xpath选择某些子节点

来自分类Dev

使用XPath硒Python获取子元素

来自分类Dev

使用xpath选择某些子节点

来自分类Dev

使用xpath查询返回子节点

来自分类Dev

使用 XPath 访问子段落内容

来自分类Dev

过滤使用子查询计算的值

来自分类Dev

使用实体框架过滤子记录

来自分类Dev

使用基于子节点的XSLT过滤XML

来自分类Dev

MongoDB:使用 $filter(aggregate) 过滤子数组

来自分类Dev

加载xml文档并使用xpath对其进行过滤

来自分类Dev

使用Regex的Spring Integration Xpath过滤器

来自分类Dev

在PostgreSQL中使用XPath过滤多个XML节点

来自分类Dev

xpath 2.0:使用其他序列过滤序列

来自分类Dev

Xpath过滤使用curl接收到的xml结果

来自分类Dev

加载xml文档并使用xpath对其进行过滤

来自分类Dev

使用 xpath 过滤 php simple_xml 加载结果

来自分类Dev

通过其XPath获取HTML元素的子元素

来自分类Dev

通过其XPath获取HTML元素的子元素