51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 810|回复: 1
打印 上一主题 下一主题

[转贴] 学会XPath,轻松抓取网页数据

[复制链接]
  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2023-11-30 14:40:01 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
    一、定义
    XPath(XML Path Language)是一种用于在 XML 文档中定位和选择节点的语言。XPath的选择功能非常强大,可以通过简单的路径选择语法,选取文档中的任意节点或节点集。学会XPath,可以轻松抓取网页数据,提高数据获取效率。
    二、XPath基础语法
    节点(Nodes): XML 文档的基本构建块,可以是元素、属性、文本等。
    路径表达式: 用于定位 XML 文档中的节点。路径表达式由一系列步骤组成,每个步骤用斜杠 / 分隔。
    XPath的节点是指在XML或HTML文档中被选择的元素或属性。XPath中有7种类型的节点,包括元素节点、属性节点、文本节点、命名空间节点、处理指令节点、注释节点以及文档节点(或称为根节点)。
    1. <font size="3">- 元素节点:表示XML或HTML文档中的元素。例如,在HTML文档中,<body>、<div>、<p>等都是元素节点。在XPath中,可以使用元素名称来选择元素节点,例如://div表示选择所有的<div>元素。

    2. - 属性节点:表示XML或HTML文档中元素的属性。例如,在HTML文档中,元素的class、id、src等属性都是属性节点。在XPath中,可以使用@符号来选择属性节点,例如://img/@src表示选择所有<img>元素的src属性。

    3. - 文本节点:表示XML或HTML文档中的文本内容。例如,在HTML文档中,<p>标签中的文本内容就是文本节点。在XPath中,可以使用text()函数来选择文本节点,例如://p/text()表示选择所有<p>元素中的文本内容。

    4. - 命名空间节点:表示XML文档中的命名空间。命名空间是一种避免元素命名冲突的方法。在XPath中,可以使用namespace轴来选择命名空间节点,例如://namespace::*表示选择所有的命名空间节点。

    5. - 处理指令节点:表示XML文档中的处理指令。处理指令是一种用来给处理器传递指令的机制。在XPath中,可以使用processing-instruction()函数来选择处理指令节点,例如://processing-instruction('xml-stylesheet')表示选择所有的xml-stylesheet处理指令节点。

    6. - 注释节点:表示XML或HTML文档中的注释。注释是一种用来添加说明和备注的机制。在XPath中,可以使用comment()函数来选择注释节点,例如://comment()表示选择所有的注释节点。

    7. - 文档节点:表示整个XML或HTML文档。文档节点也被称为根节点。在XPath中,可以使用/符号来选择文档节点,例如:/表示选择整个文档节点。
    8. </font>
    复制代码
    本文使用XML示例如下
    1. <font size="3"><font size="3"><bookstore>
    2.     <book category='fiction'>
    3.         <title>活着</title>
    4.         <author>余华</author>
    5.         <press>作家出版社</press>
    6.         <date>2012-8-1</date>
    7.         <page>191</page>
    8.         <price>20.00</price>
    9.         <staple>平装</staple>
    10.         <series>余华作品(2012版)</series>
    11.         <isbn>9787506365437</isbn>
    12.     </book>
    13.     <book category='non-fiction'>
    14.         <title>撒哈拉的故事</title>
    15.         <author>三毛</author>
    16.         <press>哈尔滨出版社</press>
    17.         <date>2003-8</date>
    18.         <page>217</page>
    19.         <price>15.80</price>
    20.         <staple>平装</staple>
    21.         <series>三毛全集(华文天下2003版)</series>
    22.         <isbn>9787806398791</isbn>
    23.     </book>
    24.     <book category='non-fiction'>
    25.         <title>明朝那些事儿(1-9)</title>
    26.         <author>当年明月</author>
    27.         <press>中国海关出版社</press>
    28.         <date>2009-4</date>
    29.         <page>2682</page>
    30.         <price>358.20</price>
    31.         <staple>精装16开</staple>
    32.         <series>明朝那些事儿(典藏本)</series>
    33.         <isbn>9787801656087</isbn>
    34.     </book>
    35. </bookstore>
    36. </font></font>
    复制代码

    除了这些基本节点类型之外,XPath还支持使用通配符:
    通配符
    描述
    示例
    *
    匹配任何元素节点
    //book/* 选取<book>元素下的任意子元素节点
    @*
    匹配任何属性节点
    //book/@* 选取<book>元素上的任意属性节点,如<book category='fiction'>中的category属性
    node()
    匹配任何类型的节点
    //book/node() 选取<book>元素下的所有类型的子节点,包括元素节点、文本节点、注释节点等

    以及使用谓词来进一步筛选选择的节点集。谓词是一种用来对节点进行过滤和排序的机制,可以包含比较运算符、逻辑运算符和函数等,部分示例如下:

    谓语
    描述
    示例
    [position()=n]
    选取位于指定位置的节点。n 是节点的位置(从 1 开始计数)
    //book[position()=1] 选取第一个<book>元素
    [last()=n]
    选取位于指定位置的最后一个节点。n 是节点的位置(从 1 开始计数)
    //book[last()=1] 选取最后一个<book>元素
    [contains(string, substring)]
    选取包含指定子字符串的节点。string 是节点的文本内容,substring 是要查找的子字符串
    //book[contains(title, 'XML')] 选取标题中包含子字符串'XML'的<book>元素
    [starts-with(string, prefix)]
    选取以指定前缀开始的节点。string 是节点的文本内容,prefix 是要匹配的前缀字符串
    //book[starts-with(title, 'The')] 选取标题以'The'开始的<book>元素
    [text()=string]
    选取文本内容完全匹配的节点。string 是要匹配的文本内容
    //book[text()='Book Title'] 选取文本内容为'Book Title'的<book>元素
    [@category='non-fiction']
    选取具有指定属性值的节点。category 是属性名称,non-fiction 是要匹配的值
    //book[@category='non-fiction'] 选取具有属性category值为'non-fiction'的<book>元素

    XPath使用路径表达式来选取XML或HTML文档中的节点或节点集。下面是一些常用的路径表达式:

    表达式
    描述
    示例
    nodename
    选取此节点的所有子节点
    //bookstore/book 选取<bookstore>元素下所有<book>子元素
    /
    从根节点选取直接子节点
    /bookstore 从根节点选取<bookstore>元素
    //
    从当前节点选取子孙节点
    //book 选取所有<book>元素,无论它们在文档中的位置
    .
    选取当前节点
    ./title 选取当前节点的<title>子元素
    ..
    选取当前节点的父节点
    ../price 选取当前节点的父节点的<price>子元素
    @
    选取属性
    //book/@id 选取所有<book>元素的id属性

    三、XPath使用示例
    选择所有名称为title的节点://title
    选择所有名称为title,同时属性lang的值为eng的节点://title[@lang='eng']
    选择id为bookstore的节点的所有子节点:/bookstore/*
    选择id为bookstore的节点的所有子孙节点:/bookstore//*
    选择id为bookstore的节点的直接子节点中的第一个节点:/bookstore/*[1]
    选择id为bookstore的节点的属性为category的值:/bookstore/@category
    四、XPath的高级用法
    XPath语言提供了一些高级的功能,包括:
    轴(Axes):XPath提供了几种轴,用于在文档中导航。包括child(子元素)、ancestor(祖先元素)、descendant(后代元素)和following-sibling(后续同级元素)等。
    函数:XPath提供了一些内置的函数,如count(),concat(),string(),local-name(),contains(),not(),string-length()等,可以用于处理和操作节点和属性3。
    条件语句:XPath提供了条件语句(如if-else语句),使得我们可以根据某些条件来选择性地提取元素或属性3。
    五、.NET中使用
    1. <font size="3"><font size="3">// XML 文档内容
    2. string xmlContent = @"
    3.             <bookstore>
    4.                 <book category='fiction'>
    5.                     <title>活着</title>
    6.                     <author>余华</author>
    7.                     <press>作家出版社</press>
    8.                     <date>2012-8-1</date>
    9.                     <page>191</page>
    10.                     <price>20.00</price>
    11.                     <staple>平装</staple>
    12.                     <series>余华作品(2012版)</series>
    13.                     <isbn>9787506365437</isbn>
    14.                 </book>
    15.                 <book category='non-fiction'>
    16.                     <title>撒哈拉的故事</title>
    17.                     <author>三毛</author>
    18.                     <press>哈尔滨出版社</press>
    19.                     <date>2003-8</date>
    20.                     <page>217</page>
    21.                     <price>15.80</price>
    22.                     <staple>平装</staple>
    23.                     <series>三毛全集(华文天下2003版)</series>
    24.                     <isbn>9787806398791</isbn>
    25.                 </book>
    26.                 <book category='non-fiction'>
    27.                     <title>明朝那些事儿(1-9)</title>
    28.                     <author>当年明月</author>
    29.                     <press>中国海关出版社</press>
    30.                     <date>2009-4</date>
    31.                     <page>2682</page>
    32.                     <price>358.20</price>
    33.                     <staple>精装16开</staple>
    34.                     <series>明朝那些事儿(典藏本)</series>
    35.                     <isbn>9787801656087</isbn>
    36.                 </book>
    37.             </bookstore>";

    38. // 创建 XPath 文档
    39. using (XmlReader reader = XmlReader.Create(new StringReader(xmlContent)))
    40. {
    41.     XPathDocument xpathDoc = new XPathDocument(reader);

    42.     // 创建 XPath 导航器
    43.     XPathNavigator navigator = xpathDoc.CreateNavigator();

    44.     // 使用 XPath 查询(选择所有位于bookstore下、其category属性值为'fiction'的book元素中的title元素)
    45.     string xpathExpression = "//bookstore/book[@category='fiction']/title";
    46.     XPathNodeIterator nodes = navigator.Select(xpathExpression);

    47.     // 检查是否有匹配的节点
    48.     if (nodes != null)
    49.     {
    50.         // 遍历结果
    51.         while (nodes.MoveNext())
    52.         {
    53.             // 检查当前节点是否为空
    54.             if (nodes.Current != null)
    55.             {
    56.                 Console.WriteLine(nodes.Current.Value);
    57.             }
    58.         }
    59.     }
    60. }
    61. </font></font>
    复制代码
    运行结果
    六、XPath在自动化测试中的应用
    XPath最常用的场景之一就是在自动化测试中用来选择HTML DOM节点。例如,在Selenium自动化测试中,可以使用XPath作为选择web元素的主要方法之一。通过XPath选择器,可以方便地定位页面中的任意元素,进行自动化测试操作。
    七、XPath的优势与不足
    XPath的优势在于其强大的选择功能,可以通过简单的路径选择语法,选取文档中的任意节点或节点集。此外,XPath还支持超过100个内建函数,可用于字符串处理、数值计算、日期和时间比较等等。这些函数可以大大提高数据处理的效率。
    然而,XPath也有其不足之处。首先,XPath对于复杂的文档结构可能会变得非常复杂,导致选择语句难以理解和维护。其次,XPath在处理大量数据时可能会出现性能问题,因为它需要遍历整个文档来查找匹配的节点。因此,在使用XPath时需要注意优化查询语句,提高查询效率。
    八、总结
    学会XPath,可以轻松抓取网页数据,提高数据获取效率。本文介绍了XPath的定义、基础语法、使用示例、高级用法、.NET中使用举例以及在自动化测试中的应用场景,同时也讨论了XPath的优势与不足。希望本文能够帮助读者更好地理解和掌握XPath的使用方法。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-1 06:53 , Processed in 0.060305 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表