在DOMDocument中导航

时间:2013-12-26 17:50:10

标签: php html dom domdocument

我正试图从电子商务网站中提取一些数据进行分析。我使用DOMDocument()方法,但我无法达到价格(9.90欧元)和产品名称(Coffret bougies P'tits饼干)。

以下代码在我之前执行过的同一页面中有24次:

$doc = new DOMDocument();
@$doc->loadHTML($page2);

获取价格和产品名称的DOM路径是什么?

    <div id="product-138156" class="blockProduct" onmouseover="javascript:layoverShow('138156');" onmouseout="javascript:layoverHide('138156');">


  <div class="block-product-hover" id="product-hover-138156" style="display: none;">
    <div class="block-product-hover-shadow-top png_fix"></div>
    <div class="block-product-hover-shadow-bg png_fix">
      <div class="picture">
        <div id="wrap" style="top:0px;z-index:9999;position:relative;"><a class="cloud-zoom" href="/FR/fr/produits/fiche/coffret-bougies-ptits-biscuits-138156.htm" rel="'bigImage': '/images/cache//e/3/-e3c5743524d99741099da77a3dff9789_w310_h310.jpg'" style="position: relative; display: block;">
          <img title="Coffret bougies P'tits biscuits" alt="Coffret bougies P'tits biscuits" src="http://cdn.maisonsdumonde.com//images/cache//e/3/-e3c5743524d99741099da77a3dff9789_w170_h170.jpg" height="170" width="170" aptsrc="/images/blank.gif" style="display: block;">        </a><div class="mousetrap" style="background-image:url(/images/blank.gif);z-index:999;position:absolute;width:170px;height:170px;left:0px;top:0px;"></div></div>
      </div>
      <div class="details">
        <h3><a href="/FR/fr/produits/fiche/coffret-bougies-ptits-biscuits-138156.htm">Coffret bougies P'tits biscuits</a>
        </h3>

        <div class="starBlock_s" itemscope="" itemtype="http://data-vocabulary.org/Review-aggregate">
                  </div>
        <div class="action">


<div>
    <span class="availability">En stock</span>
        <strong>9,90&nbsp;€</strong>
 </div>

 <a onclick="add_cart_liste_product('MTM4MTU2','MTM4MTU2','0.18722700 1388075230','MTM4MTU2','FR','fr','00000190',1); return wasaTrack('',this,200,function(data,link){ _gaq.push([ '_trackEvent', data.category, data.action ]);}, { 'category': 'AjoutPanier', 'action': 'Listes' })" class="btn-cart png_fix">Ajouter au panier</a>


        </div>
      </div>
            <div class="desc">
            <p>Hauteur : 1.6 cm <br>Largeur : 4.7 cm <br>Profondeur :  cm</p>
                        <span class="hr">&nbsp;</span>
            <p><a href="/FR/fr/produits/fiche/coffret-bougies-ptits-biscuits-138156.htm">Transformez votre intérieur avec nos objets Déco Maisons du Monde.</a></p>
                        <p><a class="more" href="/FR/fr/produits/fiche/coffret-bougies-ptits-biscuits-138156.htm">En savoir +</a></p>
        </div>
    </div>
    <div class="block-product-hover-shadow-bottom png_fix"></div>
  </div>
  <div class="picture">
    <a href="/FR/fr/produits/fiche/coffret-bougies-ptits-biscuits-138156.htm">
      <img title="Coffret bougies P'tits biscuits" alt="Coffret bougies P'tits biscuits" src="http://cdn.maisonsdumonde.com//images/cache//e/3/-e3c5743524d99741099da77a3dff9789_w170_h170.jpg" height="170" width="170" aptsrc="/images/blank.gif">    </a>
      </div>
    <div class="details">
    <h3><a href="/FR/fr/produits/fiche/coffret-bougies-ptits-biscuits-138156.htm">Coffret bougies P'tits biscuits</a>
    </h3>

        <div class="starBlock_s" itemscope="" itemtype="http://data-vocabulary.org/Review-aggregate">
            </div>
    <div class="action">







  <p>
    <span class="availability">En stock</span>
        <strong>9,90&nbsp;€</strong>

  </p>



                  <a onclick="add_cart_liste_product('MTM4MTU2','MTM4MTU2','0.22488000 1388075230','MTM4MTU2','FR','fr','00000190',1); return wasaTrack('',this,200,function(data,link){ _gaq.push([ '_trackEvent', data.category, data.action ]);}, { 'category': 'AjoutPanier', 'action': 'Listes' })" class="btn-cart png_fix">Ajouter au panier</a>


    </div>
  </div>
  </div>

4 个答案:

答案 0 :(得分:2)

它们似乎与<strong> - 标签隔离,而且这些标签只有<strong> - 标签:

$html = file_get_contents('path-to-document.html');
$dom = new DOMDocument;
$dom->loadHTML($html);
$strong = $dom->getElementsByTagName('strong');
foreach ($strong as $price) {
    preg_match_all('!\d+!', $price->nodeValue, $match);
    echo $match[0][0].'.'.$match[0][1].'<br>';
}

..两次回复9.90


<强>更新
关于productName,你可以再次

$h3 = $dom->getElementsByTagName('h3');
foreach ($h3 as $product) {
    echo $product->nodeValue;
}

输出将以纯文本格式显示“Coffret bougies P'tits biscuits”,忽略<a> - 标记;甚至在上面的循环中:

$product->nodeValue='new product name';

由于整个产品/ HTML片段位于DOM对象中,因此如果再次运行循环,则会存储新值并显示“新产品名称”。将其导出:

$dom->save($filename)

答案 1 :(得分:2)

使用您的示例数据,我可以使用DOMDocument()DOMXPath()。我只是简单地拿了你的样本数据&amp;将其放在名为test.html的文件中:

// Get the contents of the HTML file & load it into a variable.
$html = file_get_contents('test.html');

// Parse the HTML with 'DOMDocument()'
$dom = new DOMDocument();
@$dom->loadHTML($html);

// Parse the DOM with 'DOMXPath()'
$xpath = new DOMXPath($dom);

// Do an xpath query for a <strong> tag which must be nested in a <div> that has a <span> with the class being 'availability'
$resource = $xpath->query("//div/span[@class='availability']/..//strong")->item(0);

// The text content in the <strong> tag which must be nested in a <div> that has a <span> with the class being 'availability'
echo $resource->textContent;

// Dump the contents of '$resource' for debugging.
echo '<pre>';
print_r($resource);
echo '<pre>';

这里的神奇是查询:

//div/span[@class='availability']/..//strong

基本上如下:

//div/span[@class='availability']

该部分意味着只需找到一个具有“可用性”类别的人。然后是下一部分:

/..

简单地在节点中上升一级 - 类似于Unix中的目录路径 - 然后执行此操作:

//strong

现在找到标签。

价格所在的位置。 DOMDocument()DOMXPath()有时看起来令人生畏,但一旦你理解了基本语法,它就是一个非常好的工具。

答案 2 :(得分:1)

Dunno关于DOM但是

// $page2 should have the page html
preg_match("/(\d+,\d{2})&nbsp;€/",$page2, $matches);
$price = $matches[1];

答案 3 :(得分:0)

有关我最终使用的信息:

preg_replace("/[^0-9,.]/", "",str_replace(",",".",substr($linker->nodeValue, 0, -5)))