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

Posted

技术标签:

【中文标题】使用 PHP 和 Simple HTML DOM 解析 HTML 时遇到问题【英文标题】:Having trouble parsing HTML with PHP and Simple HTML DOM 【发布时间】:2019-03-08 19:31:11 【问题描述】:

我正在尝试使用 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>

【问题讨论】:

我认为你错过了innertext。试试echo $e-&gt;innertext; foreach($html->find('.salePrice') as $e) echo $e->children(2)->plainText; 感谢两位提供建议。 innertext 和 children(2)->plainText 都不成功。 【参考方案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;

【讨论】:

itemprice_0 在此 HTML 中不是唯一的。它位于每个产品内,无论是在 class="price" 还是 class="salesPrice" 内。对于获取包含 id="itemprice_0" 的价格,您有什么建议? id 属性在 html 中始终必须是唯一的。您可以编辑您的问题并放置父 html 元素吗?【参考方案2】:

我访问了 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

这就是你要找的吗?

【讨论】:

嗯...这是为我返回的代码(我知道缺少换行符):产品 1 常规价格:产品 1 销售价格:产品 1 是否可以获取包含的价格id='itemprice_0'? 用 itemprice_0 id 编辑了我的答案。【参考方案3】:

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

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

【讨论】:

以上是关于使用 PHP 和 Simple HTML DOM 解析 HTML 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP Simple HTML DOM Parser 提取标题和元描述?

php解析html类库simple_html_dom

使用php simple html dom parser解析html标签

从 Simple Html Dom 中排除不需要的 html - PHP

php simple_html_dom.php 去掉html标签

Java 等价于 PHP Simple HTML DOM Parser