从外部页面获取div,然后从中删除另一个div

时间:2014-06-06 23:40:56

标签: php xml xpath domdocument domxpath

我需要一些帮助,从外部网页获取内容。

我需要获得div,然后从其中删除另一个div。这是我的代码,有人可以帮助我吗?

这是我的XML代码的相关部分:

<html>
    ...
    <body class="domain-4 page-product-detail" > ...

         <div id="informacio" class="htab-fragment"> <!-- must select this -->
            <h2 class="description-heading htab-name">Utazás leírása</h2>
            <div class="htab-mobile tab-content">
                <p class="tab-annot">* Hivatalos ismertető</p>

                <div id="trip-detail-question"> <!-- must delete this -->
                    <form> ...</form>
                </div>

                <h3>USP</h3><p>Nagy, jól szervezett és családbarát ...</p>
                <div class="message warning-message">
                    <p>Az árak már minden aktuális kedvezményt tartalmaznak!</p>
                    <span class="ico"></span>
                </div>
            </div>
        </div>
        ... 
    </body>
</html>

我需要使用div获取id="informacio",之后我需要删除 div id="trip-detail-question",包括表单它包含。

这是我的代码,但它无法正常工作:(。

function get_content($url){

    $doc = new DOMDocument;

    $doc->preserveWhiteSpace = false;
    $doc->strictErrorChecking = false;
    $doc->recover = true;

    $doc->loadHTMLFile($url);

    $xpath = new DOMXPath($doc);

    $query = "//div[@id='informacio']";
    $entries = $xpath->query($query)->item(0);

    foreach($xpath->query("div[@id='trip-detail-question']", $entries) as $node)
        $node->parentNode->removeChild($node);

    $var = $doc->saveXML($entries);
    return $var;
}

1 个答案:

答案 0 :(得分:2)

您的第二个 XPath表达式不正确。它会尝试在您之前选择的div节点的上下文中选择div 。您正试图选择:

//div[@id='informacio']/div[@id='trip-detail-question']

并且该节点不存在。你想要这个节点:

//div[@id='informacio']/div/div[@id='trip-detail-question']

你也可以这样选择(允许任何元素,而不仅仅是div):

//div[@id='informacio']/*/div[@id='trip-detail-question']

或(允许多个嵌套级别)

//div[@id='informacio']//div[@id='trip-detail-question']

在第一个div上下文中,正确的XPath表达式为:

.//div[@id='trip-detail-question']

如果您在代码中更改它,它应该有效:

foreach($xpath->query(".//div[@id='trip-detail-question']", $entries) as $node)
    $node->parentNode->removeChild($node);