php DOMXPath怎么获取和设置子节点值

php DOMXPath怎么获取和设置子节点值,第1张

$xmlDoc = new DOMDocument;

$xmlDoc -> load($xml_resource);

$xpath = new DOMXPath($xmlDoc);

//$advert_path = '/root/advert[@id="1"]';

$statue_path = '/root/advert/status';

//$advert = $xpath -> query($advert_path) ->item(0);

$replaceNodeOld = $xpath -> query($statue_path) ->item(0);

$replaceNodeNew = = $xmlDoc -> createElement('person', 'fff');//改变成它

$replaceNodeOld = $replaceNodeOld -> item(0)->parentNode->replaceChild($replaceNodeNew, $replaceNodeOld ->item(0));

对于网页数据抓取,有BeautifulSoup、lxml以及正则表达式三种方法,其中正则表达式过于复杂,而beautifulsoup和lxml使用起来较为方便。以前简单使用过beautifulsoup(美味汤),后面为了扩展一下,熟悉一下lxml进行数据抓取。

先贴一个lxml的简单框架:

其中,最主要的在于xpath路径的获取和解析,而XPath就是地址,具体地,就是需要知道所要寻找的内容处在哪个地址下。一般而言,我们可以根据开发者工具来定位我们需要的元素,然后右击选择其所在xpath,选择初步的路径,如下图所示,

这只是一种简单的方法,更重要的,需要掌握xpath的语法规则,下面分别论述。

使用xpath获取信息,主要包括获取本文和获取属性,基本用法为

对比可以看出,一个是采用text()获取文本,一个是采用@属性获取属性值。而前面标签后面方括号就是来对标签进行筛选的。一般而言,通过选择器可以获取诸如/html/body/div[@class="useful"]/ul/li/text()的信息,但是开头的信息没有标志性,采用//div[@class="useful"]/ul/li/text()即可。

这个地方即涉及到了xpath的语法选择,主要包括以下几点:

而在选择器方面,包括以下几个

除此之外,在获取了一个元素之后,我们需要获取其下面元素的属性,即要对基于xpath获取的元素再次采用xpath,此时的获取方式为:

另外,我们也可以获取节点下面所有的字符串,方法为string(),示例为:

懒得打字了,下面的截图来自W3Cschool, >

$('#id')siblings() 当前元素所有的兄弟节点

$('#id')prev() 当前元素前一个兄弟节点

$('#id')prevaAll() 当前元素之前所有的兄弟节点

$('#id')next() 当前元素之后第一个兄弟节点

$('#id')nextAll() 当前元素之后所有的兄弟节点

这三个方法都可以添加选择器,给出选择条件,就能找到你指定的兄弟节点了。

本文主要围绕以xpath和lxml库进行展开:

一、xpath 概念、xpath节点、xpath语法、xpath轴、xpath运算符

二、lxml的安装、lxml的使用、lxml案例

一、xpath

1xpath概念

XPath 是一门在 XML 文档中查找信息的语言。XPath 使用路径表达式在 XML 文档中进行导航 。XPath 包含一个标准函数库 。XPath 是 XSLT 中的主要元素 。XPath 是一个 W3C 标准 。

2xpath节点

xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

节点关系:父、子、兄弟、先辈、后辈。

3xpath语法

xpath语法在W3c网站上有详细的介绍,这里截取部分知识,供大家学习。

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。下面列出了最有用的路径表达式:

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

XPath 通配符可用来选取未知的 XML 元素。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

通过在路径表达式中使用"|"运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

4xpath 轴

轴可定义相对于当前节点的节点集。

5xpath运算符

下面列出了可用在 XPath 表达式中的运算符:

好了,xpath的内容就这么多了。接下来我们要介绍一个神器lxml,他的速度很快,曾经一直是我使用beautifulsoup时最钟爱的解析器,没有之一,因为他的速度的确比其他的htmlparser 和html5lib快了许多。

二、lxml

1lxml安装

lxml 是一个xpath格式解析模块,安装很方便,直接pip install lxml 或者easy_install lxml即可。

2lxml 使用

lxml提供了两种解析网页的方式,一种是你解析自己写的离线网页时,另一种 则是解析线上网页。

导入包:

1解析离线网页:

2解析在线网页:

那么我们怎么获取这些标签和标签对应的属性值了,很简单,首先获取标签只需你这样做:

然后我们可以,比方说,你要获取a标签内的文本和它的属性href所对应的值,有两种方法,

1表达式内获取

2表达式外获取

这样就完成了获取,怎么样,是不是很简单了,哈哈哈。

下面再来lxml的解析规则:

3lxml案例

为了偷懒,我决定还是采用urllib那篇文章的代码,哈哈哈,机智如我。

利用xslt 取出XML文件中所有 节点名字 节点值 属性名字 属性值 '创建DOM对象 set objDom=serverCreateObject("MicroSoftXMLDom") '取得xml数据 '方法1 取得xml文件的xml数据 objDomload("c:\testxml") '方法2 取得xml数据串的数据 objDomlo

1 利用Selenium IDE

我们可以通过firefox添加插件Selenium IDE并开启。当点击红色的录制按钮后,我们对网页进行 *** 作后,该工具会录制所有的行为并转化为selenium命令,当然也就包含有了locator。

方法优点:简单、方便

方法不足:对于一些复杂点的行为可能会漏掉,因此也就无法捕获相应的locator;此外locator是自动获取的,可能不是很直观,另外无法得到统一样式的locator。

2 利用Firebug

同样firefox的插件中可以添加firebug。在Tools->Web Developer->Firebug中打开Firebug,于是能够看到页面的下半部分有显示Firebug窗口,可以查看HTML,CSS等。因为了解的粗浅,所以只能说说知道的几点简单功能。

如果我们需要查看页面某个元素的locator,可以鼠标右击,选择Inspect Element with Firebug, 于是就到了元素对应的html源码位置。这样我们根据这部分源码来写locator。

但是,往往对于一些element如button等,右击后没有反应时,我们可以考虑选择它们旁边的元素进行,到源码后再通过查找其兄弟元素源码或者上一层来找到相应源码。这里主要根据是当我们鼠标放在以某tag为根节点的源码的上时,上面的页面对应的界面元素会有相应标记。

方法缺点:写出的locator可能并不是页面的唯一,这样selenium运行就难以识别

之前写过相对父元素及下一个兄弟元素的方法。

这次补充一下xpath相对节点位置查找元素的所有方法。例子就不举了,自己可以去练练。

xpath相对节点查找方法:

1、xpath('/ancestor::')

查找当前节点的所有先辈节点,即父节点或祖父节点

2、xpath('/ancestor-or-self::')

查找当前节点的所有先辈节点以及本身

3、xpath('/attribute::')

获取当前节点的所有属性

4、xpath('/child::')

查找当前节点的所有子节点

5、xpath('/descendant::')

获取当前节点的所有后代节点,即子节点、孙节点

6、xpath('/following::')

获取当前节点结束标签后的所有节点

7、xpath('/following-sibing::')

获取当前节点的下一个兄弟节点

8、xpath('/parent::')

获取当前节点的父节点

9、xpath('/preceding::')

获取当前节点开始标签前的所有节点

10、xpath('/preceding-sibing::')

获取当前节点的上一个兄弟节点

11、xpath('/self::')

选取当前节点

大概也就这么多,这些方法非常实用,特别是有些元素通过自己的属性无法查找到的时候就需要通过相对节点的位置来查找。

以上就是关于php DOMXPath怎么获取和设置子节点值全部的内容,包括:php DOMXPath怎么获取和设置子节点值、Python lxml包下面的xpath基本用法、xpath如何获取标签内容相同的兄弟节点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9805403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存