2015-08-08 49 views
0

这里是我的代码:DOMXpath/DOM文档 - 如何解析HTML DOM元素,不仅有简单的文字

$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++; 
} 

此代码是给我的结果只喜欢文字: 选定td元素与data-column-name="Location"例如持有<span id="inside_element">Holded text</span>,而不是得到它与span我只收到像这样的简单文本:Holded text

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

提前致谢!

回答

1

无论何时您需要从特定节点获取原始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> 

替代方法

有一个不太常规方法达到相同的结果。也就是说,节省了specifc 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)); 
+0

请编辑使用'$网址你的答案=“ https://www.leaseweb.com/dedicated-servers/single-processor“;'因为看起来我无法理解你并使其工作。提前致谢! –

+0

@TonyStark你不能阅读PHP文档吗?上面解释的方法很容易适应。解决它! – felipsmartins

+0

它似乎不与我的问题示例,我使用的网址。 –