【问题标题】:Using Regular Expression to count elements使用正则表达式计算元素
【发布时间】:2012-10-16 09:18:49
【问题描述】:

我想抓取一个基于星级的评分,即对应的代码

<div class="product_detail_info_rating_stars">
    <div class="product_detail_star full"></div>
    <div class="product_detail_star full"></div>
    <div class="product_detail_star full"></div>
    <div class="product_detail_star full"></div>
    <div class="product_detail_star"></div>
</div>

每个评级都有这个代码n-p。我正在寻找一种将这些 sn-ps 转换为数字的方法,例如这个数字是 4(5 颗星中的 4 颗)。

我想到的方法是为每个评分匹配整个块,然后匹配整个班级并计算它,但也许有更好的方法,我没有看到。

有没有更好的方法来解决这个问题?

谢谢!

【问题讨论】:

  • 到目前为止你尝试过什么?你用的是什么 DOM 库?为什么你认为你需要一个正则表达式?
  • stackoverflow.com/questions/1732348/… 你真的应该使用合适的 HTML 解析器,甚至 PHP 中内置了一个 (DOMDocument)。
  • 我没有使用 DOM 库,因为它只是一个用于 wordpress 插件的小型抓取脚本。我目前正在研究正则表达式以匹配内部 div,然后我将遍历匹配项并搜索完整内容。 /&lt;div class="product_detail_info_rating_stars"&gt;(&lt;div class="product_detail_star( full)?"&gt;)+&lt;/div&gt;&lt;\/div&gt;/msU 是我目前所掌握的,需要测试,因为我在 RegEx 中一点也不流利。
  • @GordonM 我会研究一下解析器,谢谢。

标签: php regex web-scraping


【解决方案1】:

这是一个简单的示例,说明如何使用 SimpleXML 解析器和 XPath。

// Get your page HTML string
$html = file_get_contents('1page.htm');

// To suppress invalid markup warnings
libxml_use_internal_errors(true);

// Create SimpleXML object
$doc = new DOMDocument();
$doc->strictErrorChecking = false;
$doc->loadHTML($html);
$xml = simplexml_import_dom($doc);

// Find a nodes
$blocks = $xml->xpath('//div[contains(@class, "product_detail_info_rating_stars")]');

foreach ($blocks as $block)
{
    $count = 0;
    foreach ($block->children() as $child) {
        if ($child['class'] == 'product_detail_star full') {
            $count++;
        }
    }
    echo '<pre>'; print_r('Rating: ' . $count . ' of ' . $block->count()); echo '</pre>';
}

// Clear invalid markup error buffer
libxml_clear_errors();

对于这样的测试html页面:

<!doctype html>
<html>
<head></head>
<body>

<table>
    <tr>
        <td>
            <div class="product_detail_info_rating_stars">
                <div class="product_detail_star full"></div>
                <div class="product_detail_star"></div>
                <div class="product_detail_star"></div>
                <div class="product_detail_star"></div>
                <div class="product_detail_star"></div>
            </div>
        </td>
    </tr>
    <tr>
        <td>
            <div class="product_detail_info_rating_stars">
                <div class="product_detail_star full"></div>
                <div class="product_detail_star full"></div>
                <div class="product_detail_star"></div>
                <div class="product_detail_star"></div>
                <div class="product_detail_star"></div>
            </div>
        </td>
    </tr>
    <tr>
        <td>
            <div class="product_detail_info_rating_stars">
                <div class="product_detail_star full"></div>
                <div class="product_detail_star full"></div>
                <div class="product_detail_star full"></div>
                <div class="product_detail_star full"></div>
                <div class="product_detail_star"></div>
            </div>
        </td>
    </tr>
</table>

</body>
</html>

它会输出如下内容:

Rating: 1 of 5
Rating: 2 of 5
Rating: 4 of 5

玩这个来适应你的需要。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2021-10-15
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2021-12-31
    相关资源
    最近更新 更多