我正试图从电子商务网站中提取一些数据进行分析。我使用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 €</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"> </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 €</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>
答案 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}) €/",$page2, $matches);
$price = $matches[1];
答案 3 :(得分:0)
有关我最终使用的信息:
preg_replace("/[^0-9,.]/", "",str_replace(",",".",substr($linker->nodeValue, 0, -5)))