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));
这是我的代码:
$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));