Php 用于解析HTML的DOMDocument(而不是regex)

Php 用于解析HTML的DOMDocument(而不是regex),php,parsing,dom,xpath,Php,Parsing,Dom,Xpath,我正在尝试学习使用DOMDocument解析HTML代码 我只是在做一些简单的工作,我已经喜欢上了gordon的答案,并且我的代码基于他的工作 我发现PHP.net上的文档不是很好,因为信息有限,几乎没有示例,而且大多数细节都基于解析XML <?php $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTMLFile('http://www.nu.nl/internet/1106541/taalu

我正在尝试学习使用DOMDocument解析HTML代码

我只是在做一些简单的工作,我已经喜欢上了gordon的答案,并且我的代码基于他的工作

我发现PHP.net上的文档不是很好,因为信息有限,几乎没有示例,而且大多数细节都基于解析XML

<?php
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('http://www.nu.nl/internet/1106541/taalunie-keurt-open-sourcewoordenlijst-goed.html');
libxml_clear_errors();

$recipe = array();
$xpath = new DOMXPath($dom);
$contentDiv = $dom->getElementById('page'); // would have preferred getContentbyClass('content') (unique) in this case.

# title
print_r($xpath->evaluate('string(div/div/div/div/div/h1)', $contentDiv));

# content (this is not working)
#print_r($xpath->evaluate('string(div/div/div/div['content'])', $contentDiv)); // if only this worked
print_r($xpath->evaluate('string(div/div/div/div)', $contentDiv));
?>
loadHTMLFile('http://www.nu.nl/internet/1106541/taalunie-keurt-open-sourcewoordenlijst-goed.html');
libxml_clear_errors();
$recipe=array();
$xpath=newdomxpath($dom);
$contentDiv=$dom->getElementById('page');//在这种情况下,会更喜欢getContentbyClass('content')(唯一)。
#头衔
打印($xpath->evaluate($string(div/div/div/div/h1)$contentDiv));
#内容(这不起作用)
#打印($xpath->evaluate('string(div/div/div/div['content']),$contentDiv));//要是这样行就好了
打印($xpath->evaluate($string(div/div/div/div)’,$contentDiv));
?>
出于测试目的,我试图获取nu.nl新闻文章的标题(在h1标记之间)和内容(HTML)


正如您所看到的,我可以得到标题,尽管我甚至对这个evaluate字符串不太满意,因为它恰好是该div级别上唯一的h1标记。

您不应该为原始DOMDocument接口而烦恼。而是使用一个jQuery样式的类进行提取

如果使用更具体的选择器,QueryPath似乎可以正常工作:

include "qp.phar";
$qp = htmlqp("http://www.nu.nl/internet/1106541/taalunie-keurt-open-sourcewoordenlijst-goed.html");

print $qp->find(".header h1")->text();
print $qp->top()->find(".article .content")->xhtml();

但是,您可能需要先剥离混合的Javascript(
->find(“script”)->remove()
)。

以下是使用DOM和XPath的方法:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('http://www.nu.nl/…');
libxml_clear_errors();

$xpath = new DOMXPath($dom);
echo $xpath->evaluate('string(id("leadarticle")/div/h1)');
echo $dom->saveHtml(
    $xpath->evaluate('id("leadarticle")/div[@class="content"]')->item(0)
);
XPath
字符串(id(“leadarticle”)/div/h1)
将返回h1的textContent,h1是id为leadarticle的元素的子元素div的子元素

XPath
id(“leadarticle”)/div[@class=“content”]
将返回具有class属性content的div,该属性content是id为leadarticle的元素的子元素


因为您需要contentdiv的outerHTML,所以必须获取整个节点,而不仅仅是内容,因此不需要。将一个节点传递给方法(),然后将该节点序列化回HTML。

为什么不在xpath字符串中搜索
h1
?我将+1这一点,但绝对不同意您不应该为原始文档操心。我们不应该为SimpleHtmlDOM操心,但DOMDocument是一个优秀的语言无关接口和PHP扩展,从技术上讲,它包含OP所需的一切。那些第三方LIB只是增加了便利。