我昨天问了这个问题,当时这正是我所需要的,但是在处理一些实时数据时,我发现这并没有达到我的预期。使用 PHP 的 HTML DOMDocument 解析 HTML
它从 HTML 页面获取数据,但随后它还去除了捕获的文本块内的所有 HTML 标记,这不是我想要的。(我可能不想去掉一些标签,但不是全部,这可以稍后完成)
我昨天问了这个问题,当时这正是我所需要的,但是在处理一些实时数据时,我发现这并没有达到我的预期。使用 PHP 的 HTML DOMDocument 解析 HTML
它从 HTML 页面获取数据,但随后它还去除了捕获的文本块内的所有 HTML 标记,这不是我想要的。(我可能不想去掉一些标签,但不是全部,这可以稍后完成)
这是 DOM 的一个常见问题:如果要获取标签的内容及其所有子标签的内容,则必须做更多的工作。
基本上,您必须遍历与 XPath 查询匹配的子节点,以获取它们的内容。
DOMElement
在课程手册页上的用户注释中提出了一个解决方案- 请参阅此注释。
将此解决方案集成到您已经拥有的代码中应该为您提供类似于 HTML 字符串声明的内容,带有子标签:
$html = <<<HTML
<div class="main">
<div class="text">
<p>
Capture this <strong>text</strong> <em>1</em>
</p>
<p>
And some other <strong>text</strong>
</p>
</div>
</div>
HTML;
而且,要从该 HTML 字符串中提取数据,您可以使用类似的方法:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
$innerHTML = '';
// see http://fr.php.net/manual/en/class.domelement.php#86803
$children = $tag->childNodes;
foreach ($children as $child) {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($child,true));
$innerHTML .= $tmp_doc->saveHTML();
}
var_dump(trim($innerHTML));
}
唯一改变的是循环的内容:您必须迭代子元素,foreach
而不仅仅是使用。$tag->nodeValue
这给了我以下输出:
string '<p>
Capture this <strong>text</strong> <em>1</em>
</p>
<p>
And some other <strong>text</strong>
</p>' (length=150)
这是匹配的标签的全部内容<div>
,以及它的所有子项——包括标签。
注意:手册的用户注释中经常有有趣的想法和解决方案;-)
Pascal MARTIN 的回答很棒,但我发现它可以简化
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
$innerHTML = '';
$children = $tag->childNodes;
foreach ($children as $child) {
$innerHTML .= $dom->saveHTML($child);
}
var_dump(trim($innerHTML));
}
这种方式似乎产生了相同的结果,但不需要在循环DomDocument
内创建新对象。foreach
编辑:
因此,经过进一步的实验,您实际上可以将上述内容简化为:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
var_dump(trim($dom->saveHTML($tag)));
}