【问题标题】:PHP DOMDocument how to get element?PHP DOMDocument 如何获取元素?
【发布时间】:2012-05-18 13:22:40
【问题描述】:

我正在尝试阅读网站的内容,但我有一个问题,我想获取图像,链接这些元素,但我想获取它们本身的元素而不是元素内容,例如我想得到那个:我想得到那个整个元素。

我该怎么做..

<?php

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://www.link.com");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $output = curl_exec($ch);

    $dom = new DOMDocument;
    @$dom->loadHTML($output);

    $items = $dom->getElementsByTagName('a');

    for($i = 0; $i < $items->length; $i++) {
        echo $items->item($i)->nodeValue . "<br />";
    }

    curl_close($ch);;
?>

【问题讨论】:

  • 不要偏离你的问题,但我建议使用 PHP Simple HTML DOM Parser。它使这样的编码变得更加简单。 simplehtmldom.sourceforge.net/manual.htm
  • 我知道它,它会让我的生活更轻松,但我认为部分代码可以出售,我不知道我是否可以随它一起运送库。
  • 我需要知道如何获取整个元素

标签: php html parsing curl domdocument


【解决方案1】:

您似乎在询问 DOMElement 的 序列化 html?例如。你想要一个包含&lt;a href="http://example.org"&gt;link text&lt;/a&gt; 的字符串吗? (请让您的问题更清楚。)

$url = 'http://example.com';
$dom = new DOMDocument();
$dom->loadHTMLFile($url);

$anchors = $dom->getElementsByTagName('a');

foreach ($anchors as $a) {
    // Best solution, but only works with PHP >= 5.3.6
    $htmlstring = $dom->saveHTML($a);

    // Otherwise you need to serialize to XML and then fix the self-closing elements
    $htmlstring = saveHTMLFragment($a);
    echo $htmlstring, "\n";
}


function saveHTMLFragment(DOMElement $e) {
    $selfclosingelements = array('></area>', '></base>', '></basefont>',
        '></br>', '></col>', '></frame>', '></hr>', '></img>', '></input>',
        '></isindex>', '></link>', '></meta>', '></param>', '></source>',
    );
    // This is not 100% reliable because it may output namespace declarations.
    // But otherwise it is extra-paranoid to work down to at least PHP 5.1
    $html = $e->ownerDocument->saveXML($e, LIBXML_NOEMPTYTAG);
    // in case any empty elements are expanded, collapse them again:
    $html = str_ireplace($selfclosingelements, '>', $html);
    return $html;
}

但是,请注意,您所做的事情很危险,因为它可能会混合编码。最好将您的输出作为另一个 DOMDocument 并使用 importNode() 复制您想要的节点。或者,使用 XSL 样式表。

【讨论】:

    【解决方案2】:

    我假设您只是复制粘贴了一些示例代码,并没有费心尝试了解它的实际工作原理......

    无论如何,-&gt;nodeValue 部分接受元素并返回文本内容(因为元素有一个文本节点子节点 - 如果它还有其他内容,我不知道 nodeValue 会给出什么)。

    因此,只需删除 -&gt;nodeValue 即可获得您的元素。

    【讨论】:

    • 那是我无法打印出来的东西。然后说它不是字符串
    • DOMElement 类的对象无法在中转换为字符串
    • 你想要元素,DOMElement 就是元素。它不是一个字符串,所以我不确定你期望它打印什么。使用示例所需的输出编辑您的问题,这样我们就不必猜测您想说什么。
    • 好吧,我正在阅读以下内容它应该显示图像。
    • 在这种情况下,假设您有 PHP 5.3.6 或更高版本,请使用 $dom-&gt;saveHTML($items-&gt;item($i)); (docs)
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2012-03-22
    • 2011-08-18
    • 2013-06-07
    相关资源
    最近更新 更多