DOMXpath/DOMDocument - 如何解析 HTML dom 元素而不只是简单的文本

DOMXpath/DOMDocument - How to parse HTML dom elements not only with simple text

这是我的代码:

$url = "https://www.leaseweb.com/dedicated-servers/single-processor";

libxml_use_internal_errors(true); 
$doc = new DOMDocument();

$doc->loadHTMLFile($url);

$xpath = new DOMXpath($doc);

$n = $xpath->query('//td[@data-column-name="Model"]');
$r = $xpath->query('//td[@data-column-name="RAM"]');
$l = $xpath->query('//td[@data-column-name="Location"]');
$item = 0;
$i = 0;
foreach ($n as $entry) {
    $Name = $entry->nodeValue;
    $RAM  = $r->item($item)->nodeValue;
    $Location  = $l->item($item)->nodeValue;
    $i++;
    ?>
     <tr> <td><?PHP echo $i;?></td> <td><?PHP echo $Name;?></td> <td> <?PHP echo $RAM;?> </td> <td class="hidden-xs"><?PHP echo $Location;?> </td> <td><span class="label label-success">Configure</span></td> </tr>
    <?PHP
    $item++;
}

这段代码只给我结果,比如文本: 例如,带有 data-column-name="Location" 的选定 td 元素包含 <span id="inside_element">Holded text</span> 而不是使用 span 获取它,我只收到这样的简单文本:Holded text.

如何获取特定 dom html 元素中的 HTML 元素?

提前致谢!

每当您需要从特定节点获取原始 HTML 片段时,您必须调用 DOMNode::C14N()。 此方法将节点规范化为原始 HTML 字符串。让我们看一下这个例子:

<?php 
$html = '<html>
<head>  
</head>
<body>
    <div class="container">
        <div>
            <span>text span</span>
        </div>
    </div>
</body>
</html>';

$dom = DOMDocument::loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//div[@class="container"]/div');


print $nodes->item(0)->C14N();

因为我想在 div.container > div 下获取 HTML 内容,输出将是::

<div>
    <span>text span</span>
</div>

替代方法

有一种不太传统的方法可以达到相同的效果。也就是说,保存一个特定的HTML节点的HTML,像这样:

$node = $nodes->item(0);

print $node->ownerDocument->saveHTML($node); // equivalent: $nodes->C14N();

所以在你的具体情况下,它是这样的:

<?php 
$url = "https://www.leaseweb.com/dedicated-servers/single-processor";
$doc = new DOMDocument();
@$doc->loadHTMLFile($url);
$xpath = new DOMXPath($doc);
$l = $xpath->query('//td[@data-column-name="Location"]/div');

var_dump($l->item(0)->C14N()); 
# Or $l->item(0)->ownerDocument->saveHTML($l->item(0));