`
天梯梦
  • 浏览: 13783617 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

QueryPath, php上的jQuery

阅读更多

 

 

红得发紫的jQuery框架是专门用于页面Javascript程序设计的,它通过一种优雅的方式让我们轻松自如地操作页面的所有元素而无须担心浏 览器版本以及兼容性等问题。受到jQuery的启发,一种试图让Web开发者在PHP中直接采用jQuery方式操纵和生成HTML/XML元素的 QueryPath计划开始了,库的发开者是Matt Butcher

 

QueryPath可以很方便地读入和生成HTML/XML,使用jQuery类似的语法和函数遍历文档对象,支持远程URL文件的读取和分析。支 持标准的CSS3 Selector和XPath,这意味着我们可以使PHP像jQuery一样,随心所欲地玩转任何HTML!当然PHP5本身就带了不少DOM解析 库,QueryPath本身也是在这些库上的二次加工,省下了我们不少的工作量。

QueryPath官方网站:http://querypath.org/

 

QueryPath使用一个qp()工厂函数,为各种需求生成不同的类,一个最简单的例子如下:

 

require 'QueryPath/QueryPath.php'; 
$html = qp('a.html');
$html->find('title')->text('hello world');
$html->find('.myInput')->attr('value', 'hello world');
$html->find('body')->css('background-color', 'red');
 

如果你对jQuery熟悉的话,几乎可以没有任何学习成本就能很快上 手。我立刻就使用QueryPath来写了几个测试例程,分析和遍历了一个常去的网站的内容结构,抓取了和分析了不少有用的资料。感觉对于那些做网站采集 程序的家伙们来说,QueryPath是不是又要让他们更加如鱼得水(抑或是无恶不作)了,LOL。

 

使用过程中发现QueryPath库尚处于基本的开发状态,不少问题。但对于程序员来说,遇到问题读一下库的源代码,基本上就能搞定。下面列出两个 常用问题的解决,与大家分享。

 

1.当QueryPath查询到一个节点并操作完成后,它本身并不回到根节点,而是停留在节点上,不知道这样描述正确否,这样导致的结果是下一步的 查询将很可能找不到数据。解决的方法是用top()函数回到根节点。如上面的例子可以直接这样用,用top回到根:

 

$html->top()->find('.myInput')->attr('value', 'hello world');
 

支持的方法有top(), prev(), next(), child(),不用解释,很好理解。

 

 

2.无法读取远程url,或不能识别非"html"的扩展名的html文件。QueryPath直接分析文件和url的扩展名,不为"html"的直接当做xml处理,寒一个。解决的办法是用url的传递参数在最后面伪装一 个".html"的参数,告诉QueryPath这是HTML文件。解决方法:

 

$qp('http://www.acwind.net/index.php?=.html');//伪装一个后缀名,搞定。
 

希望开发者能在将来的版本中改进,能自动识别文件类型那该多好。


详解:

 

PHP 也曾在 Web 开发领域造成轰动。由于易于开发和以 Web 为中心的模型,PHP 使 Web 站点从小小的主页变成像 Yahoo! 这样强大的站点。但是,通过 PHP 来使用这三种技术 — 尤其是 XML — 有时候会比较复杂。在本文中,了解 QueryPath,这是一个 PHP 库,它在设计时考虑了两个目标:

  • 简单性,使 HTML、XML 和 HTTP 变得容易使用
  • 健壮性,为使用这些技术提供丰富的工具

本文探索如何构建 QueryPath 对象、遍历 XML 和 HTML、操纵 XML 和 HTML 以及使用 QueryPath 访问 Web 服务(使用 Twitter 作为示例服务)。

 


剖析 QueryPath 链

 

对于 QueryPath 的典型使用,有四个最重要的概念:

  • QueryPath 对象与一个 XML 或 HTML 文档相关联。
  • QueryPath 可以查询文档,识别文档中的一组匹配项。
  • QueryPath 可以操纵文档。可以添加新的部分,修改已有的部分,删除不想要的部分。
  • QueryPath 方法可以链接在一起,在一个简洁的序列中执行很多操作。只需几行代码,就可以装载、解析、查询、修改和写入文档。

清单 1 中的代码展示了所有这些要点。


清单 1. 基本的 QueryPath 链

 

<?php
require 'QueryPath/QueryPath.php';
qp('sample.html')->find('title')->text('Hello World')->writeHTML();
?>
   

以上例子需要一个库,即 QueryPath/QueryPath.php 。除非还要装载 QueryPath 扩展,否者只需包括这个库就可以使用 QueryPath。

PHP 对象语法
具有面向过程编程背景的 PHP 开发人员可能不熟悉 PHP 的面向对象语法。一个对象可能有一些附属的函数。这些函数称作方法(method) 。可以通过对象操作符 (->)调用 对象的方法。

例子中接下来一行代码是一个 QueryPath 链,它做以下事情。

  1. 创建一个新的 QueryPath 对象,该对象指向 sample.html 文档。当 qp() 运行时,它将创建一个新的 QueryPath 对象,后者随即装载和解析文档。
  2. 使用 find() 方法,它使用 CSS 3 选择器 title 搜索整个文档,寻找所有 <title/> 元素。

    在一个有效的 HTML 文档中,该搜索只能在文档的头部找到一个匹配的 <title/> 元素。

  3. 标题的文本值被设为 Hello World 。当执行到这里时,标题的子节点将被 CDATA(字符数据)字符串 Hello World 替换。任何已有的内容将被破坏。
  4. 使用 writeHTML() 方法将整个文档写到标准输出中。

以上例子实际上还可以缩短一点,因为 qp() 工厂函数带有一个 CSS 选择器作为可选的第二个参数。清单 2 显示了缩短后的版本。


清单 2. 基本的 QueryPath 链缩短后的版本

 

<?php
require 'QueryPath/QueryPath.php';

qp('sample.html', 'title')->text('Hello World')->writeHTML();
?>
 

 

假设 sample.html 是一个最基本的 HTML 文档,以上代码(清 单 1 或清单 2)的结果看上去将如清单 3 所示。加粗的行包含我们设置的标题。


清单 3. 生成的 HTML 的例子

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
	<title>Hello World</title>

</head>
<body>
</body>
</html>
 

 

这些简单的例子展示了 QueryPath 可以执行的一些常见的任务。接下来几个小节探索一些方法。然后,您将把这些构建块装配起来,创建一个简单的 Web 服务客户机。

 

qp() 工厂函数

 

QueryPath 库中最常用的函数是 qp() 工厂函数。实际上,它执行创建新的 QueryPath 对象的任务。它被用于传统的构造函数。

 

如果您熟悉面向对象设计模式,那么可能会意识到 qp() 是工厂模式的一个变种。 QueryPath 不是用构造器方法定义一个工厂类,而是使用一个函数。这种方法除了可以节省键盘输入外(在链接方法时比较重要),还可以使 QueryPath 更贴近 jQuery,减少 jQuery 熟悉者的学习曲线。

 

一个 QueryPath 对象与一个 XML 或 HTML 文档相关联。当构造 QueryPath 对象时,文档被绑定到该对象。qp() 函数带有 3 个参数,这 3 个参数都是可选的:

一个文档
可以是一个文件名或 URL、一个 XML 或 HTML 字符串、一个 DOMDocument 或 DOMElement、一个 SimpleXMLElement 或者一个 DOMElement 数组。如果不为该参数提供任何值,QueryPath 将创建一个空白的 XML 文档,供后面进行操纵。

一个 CSS3 选择器
如果提供了该参数,在装载文档时,QueryPath 将使用给定的选择器查询那个文档。

一个关联的选项数组
为这个特定 QueryPath 实例提供一种传递一组复杂配置参数的方法。API 参考详细列出了这里可以传递的选项。
XML 还是 HTML?
QueryPath 既可以处理 XML,也可以处理 HTML,但这两种格式有些区别。 QueryPath 试图自动检测所使用的格式,并作出相应的调整。XHTML(用 XML 实现的 HTML)被视作 XML。

qp() 支持将很多类型的数据作为第一个参数,从而方便构建 QueryPath 对象。QueryPath 可以以一个文件名或 URL 开始,然后装载一个文档。如果传递的是一个 XML 或 HTML 字符串,QueryPath 将解析该内容。当然,它可以接受另外两种常用的 XML 文档的对象表示:DOM 和 SimpleXML。清单 4 展示 qp() 函数如何解析包含 XML 的字符串。


清单 4. 从 XML 字符串构建 QueryPath 对象

 

<?php
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?><doc><item/></doc>';
$qp  = qp($xml);
?>
 

 

当清单 4 中的代码运行时, $qp 将引用一个 QueryPath 对象,该对象在内部指向 XML 解析后的表示。前面的例子传入的是一个文件名。如果 PHP 被配置为允许 HTTP/HTTPS 流包装器(在大多数 PHP V5 发行版中是标准配置),那么甚至可以装载远程 HTTP URL,如下所示。


清单 5. 从 URL 构建 QueryPath 对象

 

<?php
require 'QueryPath/QueryPath.php';

$qp = qp('http://example.com/file.xml');
?>
 

 

这样便可以使用 QueryPath 访问 Web 服务。(可以使用第 3 个参数 qp() 传递流上下文,以便对连接设置进行调整)。当创建新文档时,有一个添加样板 HTML 的快捷方式,如下所示。


清单 6. 使用 QueryPath::HTML_STUB 常量

 

<?php
require 'QueryPath/QueryPath.php';

$qp = qp(QueryPath::HTML_STUB);
?>
 

 

QueryPath::HTML_STUB 常量定义一个基本的 HTML 文档,如下所示。


清单 7. QueryPath::HTML_STUB 文档

 

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>Untitled</title>
</head>
<body></body>
</html>
 

 

以这个框架文档为基础,可以更快地生成 HTML。

至此,您知道了如何创建新的指向文档的 QueryPath 对象,并且看到了一个简单的 CSS 选择器。下一小节讨论如何使用 QueryPath 遍历文档。

 

遍历文档

 

打开文档后,需要在文档中查找感兴趣的内容。QueryPath 的设计使得这一任务变得很容易。为了简化遍历需求,QueryPath 提供了一些用于遍历的方法。大多数方法使用 CSS3 选择器查找所需的节点。


图 1. 重要的 QueryPath 遍历方法
重要的 QueryPath 遍历方法

图 1 总结了常用的遍历函数。下面一一描述每个函数。虽然还有一些遍历函数没有提到,但这里覆盖了大多数常见的需求。

 

表 1. 常见遍历方法

方法 描述 是否带 CSS 选择器
find() 选择与选择器匹配的任何元素(在当前选择的节点下)
xpath() 选择与给定 XPath 查询匹配的元素 否(使用 XPath 查询)
top() 选择文档元素(根元素)
parents() 选择任何祖先元素
parent() 选择直接父元素
siblings() 选择所有同胞(sibling)元素(包括之前和之后的元素)
next() 选择后一个同胞元素
nextAll() 选择当前元素之后的所有同胞元素
prev() 选择前一个同胞元素
prevAll() 选择当前元素之前的所有同胞元素
children() 选择当前元素的直接子元素
deepest() 选择当前元素下最深的节点

 

QueryPath 中的很多方法可以以查询作为参数,进一步指定应该选择什么项。如表 1 中第三列所示,几乎所有这些方法都带有一个作为可选参数的 CSS3 选择器。(xpath() 函数则带有一个 XPath 查询,而不是 CSS3 选择器)。只有 top()deepest() 不使用查询作为参数。

可以通过另一个简单的例子了解如何进行遍历。假设有一个像下面这样的 XML 文档。


清单 8. 一个简单的 XML 文档

 

<?xml version="1.0"?>
<root>
  <child id="one"/>
  <child id="two"/>
  <child id="three"/>
  <ignore/>
</root>            
 

 

<root/> 元素有 4 个子元素:其中有 3 个名为 <child/> ,还有一个名为 <ignore/> 。可以用一个 QueryPath 查询选择 <root/> 的所有 4 个子元素。


清单 9. 选择所有子元素

 

<?php 
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
  <child id="one"/>
  <child id="two"/>
  <child id="three"/>
  <ignore/>
</root>';

$qp = qp($xml, 'root')->children();
print $qp->size();
?>
 

 

children() 方法将选择 <root/> 元素的所有直接子元素。最后一行打印 QueryPath 对象中匹配项的数量,最终打印的结果为 4

假设只需选择 3 个 <child/> 元素,而不需要选择 <ignore/> 元素。 清单 10 显示了如何实现这一点。


清单 10. 使用过滤器的查询

 

<?php 
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
<child id="one"/>
<child id="two"/>
<child id="three"/>
<ignore/>
</root>';

$qp = qp($xml, 'root')->children('child');

print $qp->size();
?>
 

 

最后的 print 语句将打印 QueryPath 当前选择的项的数量。它将返回 3 。在内部,QueryPath 跟踪这 3 个元素。它们被存储为当前上下文。如果执行进一步的查询,那么查询将从这 3 个元素开始。如果试图附加数据,那么数据将被附加到这 3 个元素后。

CSS 选择器

CSS 属性
CSS3 选择器将一些属性视作专用属性。 idclass 属性都有专用的选择器语法。与其他 XML 技术不同,XML DTD 或模式不需要将这些属性指定为专用属性。这些属性仍是由 CSS3 选择器引擎处理。

CSS 选择器是 CSS 语句的一部分,用于选择将应用某种样式的元素。CSS 选择器还可以在样式表上下文之外使用。QueryPath 使用选择器作为查询语言,并支持 CSS3 选择器 标 准 中描述的特性集。

CSS 选择器在 QueryPath 中扮演很重要的角色。您已经看到,有 10 个函数使用 CSS 选择器作为参数。到目前为止使用的选择器是简单的标记名查询。CSS3 选择器要比前面的例子强大得多。对 CSS3 选择器的详细描述超出了本文的范围,但表 2 提供了一些常见的选择器模式的例子。


表 2. 常见的 CSS3 选择器模式

选择器模式 描述 示例匹配项
p 找到标记名为 <p/> 的元素 <p>
.container 找到 class 属性被设为 container 的元素 <div class="container"/>
#menu 找到 id 属性被设为 menu 的元素。基于 ID 的搜索以这种方式进行 <div id="menu"/>
[type="inline"] 找到 type 属性的值为 inline 的元素 <code type="inline"/>
tr > th 找到直接父元素为 <tr><th> 元素 <tr><th/></tr>
table td 找到祖先(例如父亲或祖父)中有 <table> 元素的 <td> 元素 <table><tr><td/></tr></table>
li:first 获取第一个名为 <li/> 的元素。支持的伪类包括 :last:even:odd <li/>
RDF|seq 找到 <RDF:seq> 元素。 QueryPath 包括用于 XML 名称空间的 CSS3 选择器。名称空间支持延伸到属性和元素 <RDF:seq>

 

这些常见的选择器模式可以加以组合,形成复杂的选择器,例如

 

div.content ul>li:first
 


。 这个选择器将搜索 class 为 content 的任何 <div/> 。 在 div 中,它将搜索所有无序列表(<ul> ),返回每个列表的第一个列表项(<li> )。

 

迭代匹配项

 

您了解了遍历文档的两个方面:QueryPath 提供的方法和 CSS3 选择器支持。第三个方面是迭代选择的项。

QueryPath 对象是可遍历的(traversable) 。在 PHP 中,这意味着对象可以当做迭代器。标准的 PHP 循环结构可以遍历 QueryPath 对象选择的元素。还记得吗,清 单 10 中的例子是一个简单的查询,它从一个 XML 文档中检索 3 个元素。接下来的例子将以这个例子为基础。

如果要单独处理每个项,应该怎么办?很容易,因为 QueryPath 可以用作迭代器。清单 11 显示了一个例子。


清单 11. 迭代选择的元素

 

<?php 
require 'QueryPath/QueryPath.php';

$xml = '<?xml version="1.0"?>
<root>
<child id="one"/>
<child id="two"/>
<child id="three"/>
<ignore/>
</root>';

$qp = qp($xml, 'root')->children('child');

foreach ($qp as $child) {
  print $child->attr('id') . PHP_EOL;
}
?>
 

 

foreach 循环迭代时,它将每个匹配项赋给 $child 变量。但是,$child 不是真正的元素,它是指向当前元素的一个 QueryPath 对象。您可以任意使用所有常见的 QueryPath 方法。

 

为了使 API 与 jQuery 的 API 类似, QueryPath 提供一些可同时作为 accessor 和 mutator — 或 getter 和 setter 的方法。取决于参数,同一个方法可以检索(access)数据,或者更改(mutate)数据。 attr() 函数就是一个例子。

 

qp()->attr('name') 检索 name 属性的值。 qp()->attr('name', 'value')name 属性的值设为 value 。还有一些方法,包括 text()html()xml() ,作为 accessor 和 mutator 同时执行两种任务。

 

由于每个迭代的项包装在一个 QueryPath 对象中,所以可以通过 $child 任意使用所有标准的 QueryPath 方法。上面的例子使用了 attr() 函数,这是一个元素中的属性的 accessor 和 mutator。

attr() 方法检索名为 id 的属性的值。下面显示以上代码的输出。


清单 12. 清单 11 中迭代器例子的输出

 

one
two
three
 

 

您已经了解了如何使用 QueryPath 方法、CSS3 选择器和迭代技术遍历文档。下一节探索如何用 QueryPath 修改文档。

 

操纵文档

 

除了使用 QueryPath 搜索文档外,还可以使用它添加、修改和移除文档中的数据。在清单 1 中可以大致了解 QueryPath 的功能。为了方便,下面再重复一遍。


清单 13. 基本的 QueryPath 链

 

<?php
require 'QueryPath/QueryPath.php';

qp('sample.html')->find('title')->text('Hello World')->writeHTML();
?>
 

 

在这个例子中,text() 函数用于修改 <title/> 元素的内容。QueryPath 提供了十几个用于更改文档的方法。图 2 展示一些常用的修改方法如何工作。这些方法都是添加或替换数据。绿色的标记表示当前被选中的元素。


图 2. 用于添加或替换内容的 QueryPath 方法


用于添加或替换内容的 QueryPath 方法

每个方法以字符串数据(通常是以 HTML 或 XML 片段的形式)作为参数,并将数据插入到文档中。随后立即可以访问和进一步操纵新插入的数据。

 

使用 HTML 和 XML 片段

实际上有两类方法。第一类方法使用任意的 XML 片段,如下所示。

append() 将数 据添加为当前选中元素的最后一个 子元素
prepend() 将 数据添加为当前选中元素的第一个 子元素
after() 将 数据直接插在当前选中元素之后
before() 将数据直接插在当前选择的元素之前
html() 替换 HTML 文档中当前元素的子内容
xml() 替换 XML 文档中当前元素的子内容

 

以上方法需要一个参数,该参数包含一个格式良好的 XML 或 HTML 数据的字符串。清单 14 有一个使用 html() 方法的例子。


清单 14. 基本的 QueryPath 链

 

<?php
require 'QueryPath/QueryPath.php';

qp($file)->find('div.content')->html('<ul><li>One</li></ul>');
?>
 

 

图 2 中没有给出 remove() 方法(难以清楚地表示移除)。 remove() 方法移除文档中的元素。如果不带参数调用,该方法将移除当前选中的元素。但是,和很多其他的 QueryPath 方法一样, remove() 可以使用一个 CSS3 选择器作为可选参数。如果提供了一个选择器,那么只移除与选择器匹配的项。

 

使用属性

图 2 中的第二类方法则操纵元素中的属性。下面介绍两个这样的例子。

attr() 获取或设 置每个选中的元素上给定属性的值
addClass() 为当前选中的每 个元素添加一个类

 

还有其他一些与属性相关的方法。例如 removeClass() 方法,该方法以一个类名作为参数,它将移除元素中的一个类。 removeAttr() 以一个属性名作为参数,它将从所有当前选中的元素中移除具有该名称的属性。

现在可以将所有这些基本功能组合到一起,形成有趣的东西。

 

示例:用 QueryPath 搜索 Twitter

 

Twitter 是一个流行的微博客服务,通过它可以发布短消息,同时还可以跟随其他 Twitter 用户的微博客。 Twitter 提供了一个简单的 Web 服务,用于公布该平台的很多特性。

 

下面的例子使用 QueryPath 在 Twitter 服务器上执行搜索,并以 HTML 格式打印结果。可以将一个工具添加到已有的 Web 站点,以显示最近的关于一个感兴趣的话题的 Twitter 活动。

 

Twitter 的搜索服务器侦听一个标准的 HTTP 服务器,当被请求时,以 Atom XML 格式返回搜索结果。我们的例子将搜索最近 5 个提到 QueryPath 的贴子。为了运行这种搜索,并以 Atom 格式返回内容,只需在 URL 中编写必要的信息: http://search.twitter.com/search.atom ?rpp=5 &q=QueryPath

加粗的 3 个部分表示针对这个应用程序进行了调整的参数。

 

.atom 提供这个扩 展名是为了告诉服务器需要返回 Atom XML 内容
rpp=5 RPP 指定每页显示的结果数。我们想要返回 5 条结果。默认情况下,将返回 5 条最近的结果
q=QueryPath 这 是查询。Twitter 支持更复杂的搜索查询,但对于这个简单的例子只需要这样的查询。

 

当装载这个 URL 时,Twitter 将返回一个 Atom 格式的 XML 文档。下面的清单 15 显示一个经过大量简化的返回文档。这里只显示最关心的信息(只显示一个条目)。


清单 15. Twitter 搜索返回的 XML 的摘录

 

<?xml version="1.0" encoding="UTF-8"?>
<feed>
  <entry>
    <content type="html">
       Last night I added XSD schema validation and XSL
       Transformation (XSLT) support to &lt;b&gt;QueryPath&lt;/b&gt; (as
       extensions). Will commit them today.
    </content>
    <link type="image/png" rel="image" href="http://example.com/img.jpg"/>
    <author>
      <name>technosophos (M Butcher)</name>
      <uri>http://twitter.com/technosophos</uri>
    </author>
  </entry>
</feed>
 

 

清单 16 显示了执行搜索的简要的 QueryPath 代码,处理返回的 XML,并创建一个文档。


清单 16. 用 QueryPath 处理返回的 XML

 

<?php
require 'QueryPath/QueryPath.php';

$url = 'http://search.twitter.com/search.atom?rpp=5&q=QueryPath';
$out = qp(QueryPath::HTML_STUB, 'body')->append('<ul/>')->find('ul');

foreach (qp($url, 'entry') as $result) {
  $title = $result->children('content')->text();
  $img = $result->siblings('link[rel="image"]')->attr('href');
  $author = $result->parent()->find('author>name')->text();
  $out->append("<li><img src='$img'/> <em>$author</em><br/>$title</li>");
}
$out->writeHTML();
?>
 

 

如果使用 Web 浏览器执行以上代码,可以看到图 3 所示的结果。


图 3. QueryPath 显示 Twitter 搜索结果


QueryPath 显示 Twitter 搜索结果

清 单 16 中的代码有 14 行,其中只有 9 行代码做实际的工作。以上代码是如何产生图 3 中的视图的呢?

 

$url 变量存放前面提到的 Twitter URL。$out 变量指向用于将 HTML 写到客户机的 QueryPath 对象。 从一个基本的文档 (QueryPath::HTML_STUB )开始,添加一个无序列表,并(使用 find() ) 选择这个新列表。

 

foreach 循环是脚本中最重要的一行: foreach (qp($url, 'entry') as $result) 。这里创建 一个新的 QueryPath 对象。由于传递了一个 URL,QueryPath 将检索远程 Atom 文档,并解析结果。另外,由于传递了选择器 entry ,QueryPath 将选择文档中的所有条目。回头查看一下 清 单 15 ,看看这是文档中的哪个部分。返回的文档中将有 5 个条目(因为 URL 中这样设置了 rpp 标志)。这 5 个条目中的每个条目看上去都应该与清单 15 中的 <entry/> 类似。

 

循环获取了 3 个数据部分:

$title 条目的内 容
$img 发帖用户的头像的 URL
$author 发 帖用户的用户名

 

为了获取每块数据,可以使用不同的 QueryPath 方法。例如,可以使用 $result->children('content')->text(); 获得 $title

 

使用 text()html()xml() 访问内容
您看到了如何使用 text() 设置文本(清 单 1 )。 清 单 16 中则使用该方法获取 信息。text() 函数将返回所有文本内容,但是不包括元素或其他节点类型。如果要获得所有内容,可以使用 xml() ,对于 HTML 文档,则可以使用 html()

循环中首先选择标记名为 content 的所有子元素,然后从发现的节点中获得 CDATA 文本。每个条目将有一个 <content/> 元素。

 

现在需要获得图像 URL。在前面的链中,选择了 <content/> 元素,所以这就是起点。现在需要搜索 <content/> 的同胞,找到形如 <link rel="image"/> 的元素。 为此,使用 siblings() 函数,并提供一个选择器作为参数。然后使用 attr() 函数获得元素的 href 属性的值。

 

最后,从 <link/> 元素跳回到它的父元素,接着使用 find('author>name') , 获得作者的用户名。(请查看 表 2 )。在这里,可以使用 text() 获得作者的用户名的文本。

 

foreach 循环的每次迭代的最后,构建一个 HTML 片段,并使用 append() 将这个片段插入到 $out QueryPath 中。

 

迭代完从 Twitter 返回的结果后,可以在脚本的最后将 HTML 文档写到浏览器:$out->writeHTML();

这样就完成了。在大约十几行代码中,您完成了与一个远程服务的交互。可以通过这种方式,使用 QueryPath 访问任何使用 HTTP 和 XML 或 HTML 的 Web 服务。QueryPath 附带的例子展示了如何设置连接参数、对 SPARQL 端点执行 SPARQL 查询以及解析复杂的、多名称空间的文档。QueryPath 为使用 Web 服务带来巨大的潜力。

 

 

结束语

 

在本文中,您探索了 QueryPath 库的基础。您学习了如何创建 QueryPath 对象、遍历文档和操纵内容。您还构建了一个小型的例子脚本,该脚本使用流行的 Twitter 微博客服务的 Web 服务 API。

 

本文只是初步发掘 QueryPath 库的一些可能的应用。例如,本文只提到数据库 API,可使用该 API 将 RDBMS 支持集成到 QueryPath。想象一下,运行一个 SQL SELECT 语句,并将结果直接合并到一个符合自己的规范的 HTML 表格中。或者再想象一下,构建一个 XML 导入器,用于解析数据并将数据直接插入到数据库中。

 

QueryPath 还有一些特性这里没有提到。通过映射器和过滤器,可以让 QueryPath 运行定制的函数来转换或过滤 QueryPath 数据。通过 QPTPL 扩展,可以将数据插入到预定义的纯 HTML 模板中。QueryPath 还支持用户定义的扩展。通过编写一个简单的类定义,可以将自己的方法添加到 QueryPath 中。

 

 

>>phpQuery—基于 jQuery的PHP实现

 

 

 

分享到:
评论

相关推荐

    了解 QueryPath PHP 库.pdf

    此外,QueryPath兼容大部分jQuery的遍历和操纵功能,确保JavaScript开发者能够快速上手。 为了满足不同需求,QueryPath还提供了扩展机制,允许用户自定义方法,涵盖数据库、模板处理和更高级的XML特性。相比于DOM和...

    QueryPath PHP 中的jQuery

    QueryPath是PHP中的一个库,它提供了类似于jQuery的操作DOM的能力。jQuery是JavaScript中非常流行的库,主要用于简化HTML文档遍历和操作、事件处理、动画和Ajax交互。QueryPath为PHP开发者提供了类似的能力,允许...

    Essence提取网页的信息像youtube视频twitter状态或博客文章

    4. **CSS 选择器**:库如 PHPQuery 和 QueryPath 提供了类似于 jQuery 的语法来定位 HTML 元素,这在处理复杂布局时特别有用。 5. **JSON 和 XML 解析**:当数据以这些结构化格式存在时,PHP 提供了 json_decode 和...

    浅析php如何实现爬取数据原理

    QueryList是基于PHP的Guzzle库和QueryPath库构建的一个数据采集工具。使用Composer安装QueryList非常简单,只需通过命令行执行以下命令: composer require jaeger/querylist 之后,我们可以通过Composer提供的...

    永磁同步电机发电给蓄电池充电控制仿真模型解析 - PMSG与双闭环控制技术

    内容概要:本文详细介绍了永磁同步旋转电机(PMSG)发电给蓄电池充电的控制仿真模型。该模型主要由永磁同步发电机、三相整流桥、整流桥控制模块、测量模块和蓄电池组成。文中首先解释了各组件的功能及其相互协作方式,接着重点讨论了整流桥控制模块的转速、电流双闭环控制机制,尤其是PI控制器的应用。此外,还探讨了储能管理和系统性能优化的方法,如通过LC滤波、自适应偏置、在线参数辨识等手段提高系统的稳定性和效率。最后,通过对实际波形的分析展示了系统的优异表现。 适合人群:从事电力系统、新能源领域的研究人员和技术人员,以及对电机控制感兴趣的工程专业学生。 使用场景及目标:适用于研究和开发高效的新能源发电与储能系统,旨在提升发电效率、稳定性和可靠性。具体应用场景包括但不限于风电场、太阳能电站、电动汽车充电站等。 其他说明:文中提供的代码片段和参数配置均为简化版本,实际应用中需根据具体情况进一步调整优化。

    餐饮业人才流失现状分析及对策研究.doc

    餐饮业人才流失现状分析及对策研究

    车辆动力学领域LQR/LQG控制的主动悬架模型研究及其MATLAB/Simulink实现

    内容概要:本文详细探讨了LQR(线性二次调节器)和LQG(线性二次高斯)控制在车辆主动悬架系统中的应用。文章首先介绍了LQR控制的基本原理,即通过状态反馈控制使系统达到最优状态。接着,通过Simulink建立了多种自由度的主动悬架模型(2自由度、4自由度和7自由度),并在MATLAB中实现了相应的控制算法。文中展示了不同自由度模型的关键性能指标对比,如悬架动挠度、簧载质量加速度等,并提供了具体的MATLAB代码示例。此外,文章还讨论了LQG控制中卡尔曼滤波的应用,以及其在处理噪声环境中的优势。 适合人群:从事车辆工程、控制系统设计的研究人员和技术人员,尤其是对主动悬架系统感兴趣的读者。 使用场景及目标:适用于希望深入了解LQR/LQG控制理论及其在车辆主动悬架系统中具体应用的人群。目标是帮助读者掌握如何利用MATLAB/Simulink搭建和优化主动悬架模型,从而提高车辆行驶的舒适性和稳定性。 其他说明:文章不仅提供了理论解释,还包括大量实用的代码片段和图表,便于读者理解和实践。特别强调了在不同自由度模型之间的选择依据,以及LQG控制在实际应用场景中的重要性。

    离职交接表.doc

    离职交接表.doc

    计算机课程设计相关资源

    计算机课程设计相关资源

    MATLAB中滚动轴承二自由度动力学建模与故障动态响应仿真

    内容概要:本文详细介绍了如何使用MATLAB进行滚动轴承的二自由度动力学建模,涵盖正常状态及内外圈、滚动体故障的动态响应仿真。首先建立了二自由度的动力学方程,定义了质量、阻尼和刚度矩阵,并根据不同类型的故障(内圈、外圈、滚动体)设置了相应的故障激励力。通过ODE求解器(如ode45)求解微分方程,得到时域内的振动波形。接着进行了频谱分析,展示了不同状态下频谱图的特点,如内圈故障在转频的倍频处出现峰值,外圈故障在较低频段有特征峰,滚动体故障表现为宽频带特性。此外,还提供了故障特征提取的方法,如包络谱分析。 适用人群:机械工程领域的研究人员和技术人员,特别是从事机械设备故障诊断和预测性维护的专业人士。 使用场景及目标:适用于需要理解和研究滚动轴承在不同工况下的动态行为的研究项目。主要目标是帮助用户掌握如何利用MATLAB进行轴承动力学建模,识别并分析各种故障模式,从而提高设备的可靠性和安全性。 其他说明:文中提供的代码可以直接用于实验验证,同时给出了许多实用的提示和注意事项,如选择合适的ODE求解器、合理设置故障幅值以及避免数值发散等问题。

    低通滤波器:滤波算法及其在传感器数据处理中的应用

    内容概要:本文详细介绍了低通滤波器的基本概念、不同类型的滤波算法以及它们的应用场景。首先解释了简单的移动平均滤波,这是一种常用且易实现的方法,适用于快速去除高频噪声。接着深入探讨了一阶RC低通滤波器的工作原理和实现方式,强调了alpha系数的选择对滤波效果的影响。此外,还提到了基于环形缓冲区的实时滤波技术和更高阶的巴特沃斯滤波器,后者提供了更好的频率选择性和稳定性。文中通过多个实例展示了如何根据具体的传感器数据特点选择合适的滤波算法,并给出了相应的Python代码片段用于演示和验证。 适合人群:从事嵌入式系统开发、传感器数据分析及相关领域的工程师和技术爱好者。 使用场景及目标:帮助开发者理解和掌握不同类型低通滤波器的特点与实现方法,以便更好地应用于实际项目中,如处理陀螺仪、温度传感器、心率传感器等设备的数据,提高信号质量和系统的可靠性。 其他说明:文章不仅提供了理论知识,还包括了许多实用技巧和注意事项,如滤波器参数的选择、初始化处理、采样率稳定性等问题,这些都是确保滤波效果的关键因素。同时,附带的代码示例可以帮助读者更快地上手实践。

    基于自抗扰控制(ADRC)的永磁同步电机(PMSM)矢量控制技术及其实现

    内容概要:本文深入探讨了基于自抗扰控制(ADRC)的永磁同步电机(PMSM)矢量控制技术。首先介绍了PMSM的特点及其广泛应用背景,强调了矢量控制在实现电机高性能控制方面的重要性。针对传统矢量控制存在的不足,引入了ADRC这一新型控制策略,详细解释了ADRC的工作原理,包括跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF)三个组成部分的功能。随后展示了如何将ADRC应用于PMSM的电流环和速度环控制中,并提供了具体的Python代码实现示例。实验结果显示,在面对负载变化等扰动情况下,采用ADRC的控制系统表现出更好的稳定性和平滑性。 适用人群:从事电机控制领域的研究人员和技术人员,特别是那些希望深入了解并掌握先进控制算法的人群。 使用场景及目标:适用于需要提高永磁同步电机控制系统鲁棒性和响应速度的应用场合,如工业自动化设备、电动汽车等领域。目标是帮助读者理解ADRC的基本概念及其在PMSM矢量控制中的具体应用,从而能够在实际项目中实施该技术。 其他说明:文中还讨论了一些实用技巧,如参数调整的方法和注意事项,以及与其他控制方法(如PI控制)的性能对比。此外,作者鼓励读者尝试不同的参数配置以找到最适合特定应用场景的最佳设置。

    外贸公司员工离职流程及工作交接程序.xls

    外贸公司员工离职流程及工作交接程序.xls

    基于博途1200PLC的教学楼打铃控制系统:数码管显示与定时打铃的实现

    内容概要:本文详细介绍了基于西门子S7-1200 PLC的教学楼打铃控制系统的设计与实现。硬件方面,采用4位7段共阳数码管直接连接PLC的DO点,通过中间继电器或晶体管输出型PLC确保电流足够。软件部分,使用SCL语言编写动态扫描程序,实现数码管的时间显示,并通过系统时钟和定时器实现精确的打铃控制。此外,文章还讨论了数码管显示调试中的常见问题及其解决方案,如鬼影消除、段码转换和时间同步等。 适合人群:具备PLC编程基础的技术人员,尤其是对工业自动化感兴趣的工程师。 使用场景及目标:适用于需要构建或维护教学楼打铃系统的学校和技术爱好者。目标是掌握PLC编程技巧,理解数码管显示和定时控制的工作原理,以及提高对硬件配置和调试的理解。 其他说明:文中提供了详细的代码片段和硬件配置建议,帮助读者更好地理解和实施该项目。同时,强调了项目中的挑战和解决方案,使读者能够避免常见的错误并优化系统性能。

    三菱PLC与显触摸屏实现定长送料系统的伺服/步进控制

    内容概要:本文详细介绍了如何利用三菱PLC(具体型号为FX5U-32MT)和显触摸屏构建定长送料控制系统。该系统支持伺服和步进电机两种驱动方式,涵盖了点动、相对定位和绝对定位三大核心功能。文中不仅提供了详细的硬件连接方法,还展示了具体的PLC梯形图编程实例,以及触摸屏界面的设计要点。特别强调了调试过程中可能遇到的问题及其解决方案,如电子齿轮比计算错误、绝对定位前的原点回归、急停信号的正确接入等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些对PLC编程和伺服/步进电机控制有一定基础的人群。 使用场景及目标:适用于需要精确控制物料长度的场合,如包装、切割等行业。通过该系统可以提高生产效率,减少人工干预,确保送料精度达到±0.02mm。此外,还可以帮助用户掌握PLC编程技巧,提升对伺服/步进电机的理解。 其他说明:文章中提到的一些关键技术点,如点动模式的手动微调、绝对定位的坐标系建立、相对定位的连续作业优化等,对于理解和实施类似的自动化项目非常有帮助。同时,作者分享了许多宝贵的实践经验,有助于读者避开常见陷阱并顺利完成项目部署。

    信号处理领域中基于EMD及其改进方法的信号降噪与性能评估

    内容概要:本文详细介绍了如何利用经验模态分解(EMD)及其两种改进方法——集合经验模态分解(EEMD)和互补集合经验模态分解(CEEMDAN),来进行信号降噪。首先构建了一个由多个正弦波组成的混合信号并加入高斯噪声,随后使用三种方法对该带噪信号进行了分解,通过相关系数筛选有效的固有模态函数(IMF),最终重构信号并评估降噪效果。文中提供了详细的Python代码实现,包括信号生成、分解、重构以及性能评估的具体步骤。性能评估主要采用信噪比(SNR)和均方误差(MSE)作为衡量标准,结果显示CEEMDAN在降噪方面表现出色。 适合人群:从事信号处理领域的研究人员和技术人员,尤其是那些希望深入了解EMD系列算法及其应用的人群。 使用场景及目标:适用于需要对含噪信号进行预处理的各种应用场景,如机械故障诊断、生物医学工程等领域。目标是提高信号的质量,从而更好地支持后续的数据分析和决策制定。 其他说明:文中不仅提供了完整的代码实现,还讨论了不同参数的选择对降噪效果的影响,强调了实际应用中需要注意的问题,如计算资源限制、信号特性的考虑等。此外,作者鼓励读者尝试将仿真信号替换为实际数据,以便更好地理解和掌握这些方法的应用技巧。

    医学图像分割数据集:眼底血管图像语义分割数据集(约48张数据和标签)

    医学图像分割数据集:眼底血管图像语义分割数据集(约48张数据和标签) 【2类别的分割】:背景:0,1:眼底血管(具体参考classes文件) 数据集介绍:【已经划分好】 训练集:images图片目录+masks模板目录,34张左右图片和对应的mask图片 验证集:images图片目录+masks模板目录,10张左右图片和对应的mask图片 测试集:images图片目录+masks模板目录,4张左右图片和对应的mask图片 除此之外,包含一个图像分割的可视化脚本,随机提取一张图片,将其原始图片、GT图像、GT在原图蒙板的图像展示,并保存在当前目录下 医学图像分割网络介绍:https://blog.csdn.net/qq_44886601/category_12102735.html 更多图像分割网络unet、swinUnet、trasnUnet改进,参考改进专栏:https://blog.csdn.net/qq_44886601/category_12803200.html

    汽车工程中MATLAB/Simulink实现电动助力转向(EPS)系统的企业级量产模型

    内容概要:本文详细介绍了如何利用MATLAB和Simulink构建并优化电动助力转向(EPS)系统的企业级量产模型。首先探讨了随速助力曲线的设计,展示了如何通过车速和手力矩传感器输入计算助力扭矩。接着深入讲解了Simulink ASW(应用软件层)子系统的具体实现,包括移动平均滤波、助力特性模块、状态机设计以及回正控制等关键技术环节。文中还特别强调了处理现实世界非线性的挑战,如温度补偿、摩擦补偿和故障诊断方法。此外,讨论了手力闭环控制、PID调节、状态机设计以及摩擦模型简化等方面的技术细节,并提到了模型在环测试(MIL)、硬件在环测试(HIL)等验证手段。 适合人群:从事汽车电子控制系统开发的研究人员和技术工程师,尤其是对电动助力转向系统感兴趣的开发者。 使用场景及目标:适用于希望深入了解EPS系统内部工作原理及其优化方法的专业人士。主要目标是帮助读者掌握如何使用MATLAB/Simulink搭建高效可靠的EPS模型,从而应用于实际产品开发中。 其他说明:文章不仅提供了理论知识,还包括了许多实用的代码片段和实践经验分享,有助于读者更好地理解和应用相关技术。

    51单片机光照强度检测系统的实现与优化:滑动变阻器模拟光敏电阻的应用

    内容概要:本文详细介绍了基于51单片机的光照强度检测系统的设计与实现。主要采用滑动变阻器模拟光敏电阻,通过ADC0804进行模数转换,最终在LCD显示屏上显示光照强度等级。文中不仅提供了详细的硬件连接方法,如滑动变阻器与ADC0804的连接、单片机控制ADC的启动和读数等,还包括了完整的C语言源代码,涵盖了ADC读取、数据处理、阈值判断以及Protues仿真的具体步骤。此外,作者还分享了一些实用的调试技巧,如使用_nop_()指令保证信号稳定、加入滤波算法提高数据准确性等。 适合人群:具有一定单片机基础知识的学习者、电子爱好者、初学者及希望深入了解ADC工作的工程师。 使用场景及目标:①帮助读者掌握51单片机与ADC的工作原理及其应用;②提供一种低成本、易操作的光照检测解决方案;③通过实例演示,让读者学会如何进行硬件连接、编写相关程序并解决常见问题。 其他说明:文章强调了硬件连接的注意事项,如ADC0804的CLK引脚接法、滑动变阻器的设置范围等,并给出了具体的代码实现,便于读者理解和实践。同时,还提到了一些优化措施,如加入抗干扰设计、改进数据处理算法等,进一步提升了系统的性能。

    基于Comsol的三轴试验数值模拟:D-C、D-P、M-C准则的应用与实现

    内容概要:本文详细介绍了如何利用Comsol软件结合邓肯张(D-C)、德鲁克普拉格(D-P)和摩尔库伦(M-C)准则进行三轴试验的数值模拟。首先简述了各准则的基本概念及其适用范围,接着逐步讲解了在Comsol中创建土样模型、设定材料属性、施加边界条件和载荷的具体步骤。随后,文章展示了求解过程及结果分析方法,强调了通过数值模拟生成应力-应变曲线并与实际试验数据对比的重要性。此外,文中还提供了许多实用技巧,如参数设置、加载步控制、网格划分等,帮助提高模拟精度和效率。 适合人群:从事岩土工程研究的技术人员、研究生及以上学历的研究人员。 使用场景及目标:适用于需要深入了解土体力学特性的科研工作者,旨在通过数值模拟辅助实际三轴试验,减少实验成本并提升研究深度。具体目标包括掌握不同准则的特点及应用场景,学会使用Comsol进行三轴试验建模与仿真,能够根据模拟结果优化试验设计。 其他说明:文章不仅涵盖了理论知识和技术细节,还分享了许多实践经验,有助于读者更好地理解和应用所学内容。

Global site tag (gtag.js) - Google Analytics