php本身自带了,DomXpath,可以方便提取网页中的元素内容. 为了方便操作还需要启用tidy扩展包, windows系统在php.ini 中的extensions=php_tidy.dll行去掉注释即可.
http://php.net/manual/zh/class.domxpath.php
<?php
$content= file_get_contents('http://php.net');
$document = new DOMDocument();
$document->strictErrorChecking = false;
//使用tidy规范网页中不规范的内容,否则可能导致document出错
$tidy = new tidy;
$content = $tidy->repairString($content);
//使用utf-8编码
$content = mb_convert_encoding($content, 'UTF-8');
$document->loadXML(
$content,
LIBXML_NOERROR | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOCDATA
);
$xpath = new DOMXPAth($document);
//选择要查找的id
$elements = $xpath->query("//*[@id='intro']");
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "[". $element->nodeName. "]";
}
}
?>
更详细的使用方法:
XPath简介
XPath是W3C的一个标准。它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计。目前有XPath1.0和XPath2.0两个版本。其中Xpath1.0是1999年成为W3C标准,而XPath2.0标准的确立是在2007年。W3C关于XPath的英文详细文档请见:http://www.w3.org/TR/xpath20/ 。
XPath是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。XPath2.0是XPath1.0的超集。它是对XPath1.0的扩展,它可以支持更加丰富的数据类型,并且XPath2.0保持了对XPath1.0的相对很好的向后兼容性,几乎所有的XPath2.0的返回结果都可以和XPath1.0保持一样。另外XPath2.0也是XSLT2.0和XQuery1.0的用于查询定位节点的主表达式语言。XQuery1.0是对XPath2.0的扩展。关于在XSLT和XQuery中使用XPath表达式定位节点的知识在后面的实例中会有所介绍。
在学习XPath之前你应该对XML的节点,元素,属性,原子值(文本),处理指令,注释,根节点(文档节点),命名空间以及对节点间的关系如:父(Parent),子(Children),兄弟(Sibling),先辈(Ancestor),后代(Descendant)等概念有所了解。这里不在说明。
XPath路径表达式
在本小节下面的内容中你将可以学习到:
路径表达式语法
相对/绝对路径
表达式上下文
谓词(筛选表达式)及轴的概念
运算符及特殊字符
常用表达式实例
函数及说明
路径表达式语法:
路径 = 相对路径 | 绝对路径
XPath路径表达式 = 步进表达式 | 相对路径 "/"步进表达式。
步进表达式=轴 节点测试 谓词
说明:
其中轴表示步进表达式选择的节点和当前上下文节点间的树状关系(层次关系),节点测试指定步进表达式选择的节点名称扩展名,谓词即相当于过滤表达式以进一步过滤细化节点集。
谓词可以是0个或多个。多个多个谓词用逻辑操作符and, or连接。取逻辑非用not()函数。
请看一个典型的XPath查询表达式:/messages/message//child::node()[@id=0],其中/messages/message是路径(绝对路径以"/"开始),child::是轴表示在子节点下选择,node()是节点测试表示选择所有的节点。[@id=0]是谓词,表示选择所有有属性id并且值为0的节点。
相对路径与绝对路径:
如果"/"处在XPath表达式开头则表示文档根元素,(表达式中间作为分隔符用以分割每一个步进表达式)如:/messages/message/subject是一种绝对路径表示法,它表明是从文档根开始查找节点。假设当前节点是在第一个message节点【/messages/message[1]】,则路径表达式subject(路径前没有"/")这种表示法称为相对路径,表明从当前节点开始查找。具体请见下面所述的"表达式上下文"。
表达式上下文(Context):
上下文其实表示一种环境。以明确当前XPath路径表达式处在什么样的环境下执行。例如同样一个路径表达式处在对根节点操作的环境和处在对某一个特定子节点操作的环境下执行所获得的结果可能是完全不一样的。也就是说XPath路径表达式计算结果取决于它所处的上下文。
XPath上下文基本有以下几种:
&nb