使用PHP和简单HTML DOM解析HTML时遇到问题

时间:2018-10-03 14:21:38

标签: php html parsing dom scrape

我正在尝试使用simple_html_dom.php解析HTML。我尝试解析的HTML如下所示。我可以成功获取每个产品名称:Product 1Product 2Product 3,等等。

我还想从每种产品中抢购itemprice_0。这是我遇到问题的地方。这是我的代码:

<?php
require_once 'simple_html_dom.php';

$html = file_get_html('https://www.webaddress.com');

foreach($html->find('span.productName') as $e)
echo $e.'<br />'; //successfully displays all product names

foreach($html->find('#itemprice_0') as $e)
echo $e; //doesn't display the item prices

foreach($html->find('.dollar') as $e)
echo $e; //doesn't display the dollar amounts
?>

以下是HTML:

<span class="productName">Product 1</span>  

<p class="price">
<strike>
<span class="dollar-symbol">$</span>  
<span class="dollar">15</span><span class="dot">.</span>  
<span class="cents">99</span></strike>
</p>  

<p class="salePrice" id='itemprice_0'>  
<span class="dollar-symbol">$</span>  
<span class="dollar">13</span><span class="dot">.</span>  
<span class="cents">99</span>  
</p>

3 个答案:

答案 0 :(得分:1)

itemprice_0是唯一的,如果要选择多个元素,则应使用类选择器。在simple_html_dom中,您可以获取这样的嵌套元素(未经测试):

<?php
require_once 'simple_html_dom.php';

foreach($html->find('.salePrice') as $prices){
    echo $price->find('.dollor')->plaintext;
    echo $price->find('.cents')->plaintext;
}

答案 1 :(得分:1)

我访问了salePrice类并回显了美元金额。

foreach($html->find('span.productName') as $e)
    echo $e.'<br />'; //successfully displays all product names

foreach($html->find('p.price') as $e)
    $e = str_replace(' ', '', $e);
    echo 'Regular Price: ' . $e;

foreach($html->find('p.salePrice') as $e)
    $e = str_replace(' ', '', $e);
    echo 'Sale Price: ' . $e;

我也删除了空格。

结果:

Product 1
Regular Price: $15.99
Sale Price: $13.99

我还使循环仅查找itemprice_0 id,并得到了相同的结果:

foreach($html->find('p[id=itemprice_0]') as $e)
$e = str_replace(' ', '', $e);
echo 'Sale Price: ' . $e;

相同结果:

Product 1
Regular Price: $15.99
Sale Price: $13.99

这是您要找的东西吗?

答案 2 :(得分:0)

您可以使用以下解决方案来解决您的问题:

$domd=@DOMDocument::loadHTML($html);
$xp=new DOMXPath($domd);
foreach($xp->query('//*[contains(@class,"dollar")]') as $e)
var_dump($e->textContent);