代码之家  ›  专栏  ›  技术社区  ›  Brian

如何使用CURL从页面解析实际的HTML?

  •  6
  • Brian  · 技术社区  · 14 年前

    我正在“尝试”刮取一个网页,该网页具有以下结构:

    <p class="row">
        <span>stuff here</span>
        <a href="http://www.host.tld/file.html">Descriptive Link Text</a>
        <div>Link Description Here</div>
    </p>
    

    我正在使用curl刮取网页:

    <?php
        $handle = curl_init();
        curl_setopt($handle, CURLOPT_URL, "http://www.host.tld/");
        curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
        $html = curl_exec($handle);
        curl_close($handle);
    ?>
    

    我做了一些研究,发现我不应该使用正则表达式来解析从curl返回的HTML,而应该使用PHP-DOM。我就是这样做的:

    $newDom = new domDocument;
    $newDom->loadHTML($html);
    $newDom->preserveWhiteSpace = false;
    $sections = $newDom->getElementsByTagName('p');
    $nodeNo = $sections->length;
    for($i=0; $i<$nodeNo; $i++){
        $printString = $sections->item($i)->nodeValue;
        echo $printString . "<br>";
    }
    

    for($i=0; $i<$nodeNo; $i++){
        $printString = $sections->item($i)->nodeValue;
        echo "<a href=\"<extracted link>\">LINK</a> " . $printString . "<br>";
    }
    

    如你所见,我无法得到链接,因为我只得到 文本 来源 ,就像我想要的。我知道“curl\u exec”在拉HTML,因为我已经尝试过了,所以我相信DOM在某种程度上剥离了我想要的HTML。

    3 回复  |  直到 13 年前
        1
  •  4
  •   Borealid    14 年前

    the PHP manual on DOM ,则应在循环中使用以下内容:

        $tmp_dom = new DOMDocument();
        $tmp_dom->appendChild($tmp_dom->importNode($sections->item($i), true));
        $innerHTML = trim($tmp_dom->saveHTML()); 
    

    $innerHTML 作为节点的HTML内容。

    但我认为您真正想要的是在“p”节点下获得“a”节点,所以请执行以下操作:

    $sections = $newDom->getElementsByTagName('p');
    $nodeNo = $sections->length;
    for($i=0; $i<$nodeNo; $i++) {
        $sec = $sections->item($i);
        $links = $sec->getElementsByTagName('a');
        $linkNo = $links->length;
        for ($j=0; $j<$linkNo; $j++) {
            $printString = $links->item($j)->nodeValue;
            echo $printString . "<br>";
        }
    }
    

    这将只打印每个链接的主体。

        2
  •  1
  •   janmoesen    14 年前

    DOMDocument::saveXML() . 试试这个:

    $printString = $newDom->saveXML($sections->item($i));

        3
  •  0
  •   Scott Evernden    14 年前

    你可能想看看 phpQuery basic example