关于查询的DOMXpath查询

时间:2012-03-28 14:48:50

标签: php html dom xpath domxpath

我有以下HTML:

[...]
<div class="row clearfix">
    <div class="col1">Data</div>
    <div class="col2">Data</div>
    <div class="col3">Data</div>
    <div class="col4">Data</div>
    <div class="col5">Data</div>
    <div class="col6">Data</div>
    <div class="col7">Data</div>
    <div class="col8">Data</div>
</div><!--// row-->

<div class="row clearfix otherClass">
    <div class="col1">Data</div>
    <div class="col2">Data</div>
    <div class="col3">Data</div>
    <div class="col4">Data</div>
    <div class="col5">Data</div>
    <div class="col6">Data</div>
    <div class="col7">Data</div>
    <div class="col8">Data</div>
</div><!--// row-->

<div class="row clearfix thirdClass">
    <div class="col1">Data</div>
    <div class="col2">Data</div>
    <div class="col3">Data</div>
    <div class="col4">Data</div>
    <div class="col5">Data</div>
    <div class="col6">Data</div>
    <div class="col7">Data</div>
    <div class="col8">Data</div>
</div><!--// row-->
[...]

我希望从HTML中获取所有这些div,它们都以&#34; row clearfix&#34;开头。作为类,但可以有更多的数据。 之后我希望能够单独处理每个col,所以得到col1,col2,col3等的值。

我写了这段代码,但现在卡住了。有人可以帮助我吗?

        $oDom = new DOMDocument();
        $oDom->loadHtml($a_sHTML);

        $oDomXpath = new DOMXpath($oDom);
        $oDomObject = $oDomXpath->query('//div[@class="row clearfix"]');

        foreach ($oDomObject as $oObject) {
            var_dump($oObject->query('//div[@class="col1"]')->nodeValue);
        }



更新 * 解决方案 *
感谢下面的回复,我使用了以下代码:

    $oDom = new DOMDocument();
    @$oDom->loadHtml($a_sHTML);

    $oDomXpath = new DOMXpath($oDom);
    $oDomObject = $oDomXpath->query('//div[contains(@class,"row") and contains(@class,"clearfix")]');

    foreach ($oDomObject as $oObject) {
        foreach($oObject->childNodes as $col)
        {
            if ($col->hasAttributes())
            {
                var_dump($col->getAttribute('class') . " == " . trim($col->nodeValue));
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

为了匹配外部div,我认为你需要的是

//div[starts-with(@class,"row clearfix")]

//div[contains(@class,"row clearfix")]

//div[contains(@class,"row") and contains(@class,"clearfix")]

我选择最后一个,因为班级名称可以是任何顺序。

我不是100%确定你想对内部div做什么,但是你可以用这样的东西得到它们:

div[starts-with(@class,"col")]