学会XPath,轻松抓取网页数据

这篇具有很好参考价值的文章主要介绍了学会XPath,轻松抓取网页数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、定义

XPath(XML Path Language)是一种用于在 XML 文档中定位和选择节点的语言。XPath的选择功能非常强大,可以通过简单的路径选择语法,选取文档中的任意节点或节点集。学会XPath,可以轻松抓取网页数据,提高数据获取效率。

二、XPath基础语法

节点(Nodes): XML 文档的基本构建块,可以是元素、属性、文本等。
路径表达式: 用于定位 XML 文档中的节点。路径表达式由一系列步骤组成,每个步骤用斜杠 / 分隔。

XPath的节点是指在XML或HTML文档中被选择的元素或属性。XPath中有7种类型的节点,包括元素节点、属性节点、文本节点、命名空间节点、处理指令节点、注释节点以及文档节点(或称为根节点)。

- 元素节点:表示XML或HTML文档中的元素。例如,在HTML文档中,<body>、<div>、<p>等都是元素节点。在XPath中,可以使用元素名称来选择元素节点,例如://div表示选择所有的<div>元素。

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

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

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

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

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

- 文档节点:表示整个XML或HTML文档。文档节点也被称为根节点。在XPath中,可以使用/符号来选择文档节点,例如:/表示选择整个文档节点。

本文使用XML示例如下

<bookstore>
    <book category='fiction'>
        <title>活着</title>
        <author>余华</author>
        <press>作家出版社</press>
        <date>2012-8-1</date>
        <page>191</page>
        <price>20.00</price>
        <staple>平装</staple>
        <series>余华作品(2012版)</series>
        <isbn>9787506365437</isbn>
    </book>
    <book category='non-fiction'>
        <title>撒哈拉的故事</title>
        <author>三毛</author>
        <press>哈尔滨出版社</press>
        <date>2003-8</date>
        <page>217</page>
        <price>15.80</price>
        <staple>平装</staple>
        <series>三毛全集(华文天下2003版)</series>
        <isbn>9787806398791</isbn>
    </book>
    <book category='non-fiction'>
        <title>明朝那些事儿(1-9)</title>
        <author>当年明月</author>
        <press>中国海关出版社</press>
        <date>2009-4</date>
        <page>2682</page>
        <price>358.20</price>
        <staple>精装16开</staple>
        <series>明朝那些事儿(典藏本)</series>
        <isbn>9787801656087</isbn>
    </book>
</bookstore>

除了这些基本节点类型之外,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中使用

// XML 文档内容
string xmlContent = @"
            <bookstore>
                <book category='fiction'>
                    <title>活着</title>
                    <author>余华</author>
                    <press>作家出版社</press>
                    <date>2012-8-1</date>
                    <page>191</page>
                    <price>20.00</price>
                    <staple>平装</staple>
                    <series>余华作品(2012版)</series>
                    <isbn>9787506365437</isbn>
                </book>
                <book category='non-fiction'>
                    <title>撒哈拉的故事</title>
                    <author>三毛</author>
                    <press>哈尔滨出版社</press>
                    <date>2003-8</date>
                    <page>217</page>
                    <price>15.80</price>
                    <staple>平装</staple>
                    <series>三毛全集(华文天下2003版)</series>
                    <isbn>9787806398791</isbn>
                </book>
                <book category='non-fiction'>
                    <title>明朝那些事儿(1-9)</title>
                    <author>当年明月</author>
                    <press>中国海关出版社</press>
                    <date>2009-4</date>
                    <page>2682</page>
                    <price>358.20</price>
                    <staple>精装16开</staple>
                    <series>明朝那些事儿(典藏本)</series>
                    <isbn>9787801656087</isbn>
                </book>
            </bookstore>";

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

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

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

    // 检查是否有匹配的节点
    if (nodes != null)
    {
        // 遍历结果
        while (nodes.MoveNext())
        {
            // 检查当前节点是否为空
            if (nodes.Current != null)
            {
                Console.WriteLine(nodes.Current.Value);
            }
        }
    }
}

运行结果
学会XPath,轻松抓取网页数据

六、XPath在自动化测试中的应用

XPath最常用的场景之一就是在自动化测试中用来选择HTML DOM节点。例如,在Selenium自动化测试中,可以使用XPath作为选择web元素的主要方法之一。通过XPath选择器,可以方便地定位页面中的任意元素,进行自动化测试操作。

七、XPath的优势与不足

XPath的优势在于其强大的选择功能,可以通过简单的路径选择语法,选取文档中的任意节点或节点集。此外,XPath还支持超过100个内建函数,可用于字符串处理、数值计算、日期和时间比较等等。这些函数可以大大提高数据处理的效率。

然而,XPath也有其不足之处。首先,XPath对于复杂的文档结构可能会变得非常复杂,导致选择语句难以理解和维护。其次,XPath在处理大量数据时可能会出现性能问题,因为它需要遍历整个文档来查找匹配的节点。因此,在使用XPath时需要注意优化查询语句,提高查询效率。

八、总结

学会XPath,可以轻松抓取网页数据,提高数据获取效率。本文介绍了XPath的定义、基础语法、使用示例、高级用法、.NET中使用举例以及在自动化测试中的应用场景,同时也讨论了XPath的优势与不足。希望本文能够帮助读者更好地理解和掌握XPath的使用方法。文章来源地址https://www.toymoban.com/news/detail-747559.html

希望以上内容能够帮助你理解和学习XPath。欢迎点赞、关注、收藏,如果你还有其他问题,欢迎评论区交流。

到了这里,关于学会XPath,轻松抓取网页数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Puppeteer让你网页操作更简单(2)抓取数据

    Puppeteer让你网页操作更简单(1)屏幕截图】 现在您已经了解了Headless Chrome和Puppeteer的工作原理基础知识,让我们看一个更复杂的示例,其中我们实际上可以抓取一些数据。 首先,请查看此处的Puppeteer API文档。如您所见,有大量不同的方法我们可以使用不仅可以在网站上点击,还可以

    2024年01月16日
    浏览(44)
  • 小白用chatgpt编写python 爬虫程序代码 抓取网页数据(js动态生成网页元素)

    jS动态生成,由于呈现在网页上的内容是由JS生成而来,我们能够在浏览器上看得到,但是在HTML源码中却发现不了        如果不加,如果网站有防爬技术,比如频繁访问,后面你会发现什么数据都取不到 User-Agent获取地方:  网页获取位置: 使用代理IP解决反爬。(免费代理

    2024年02月01日
    浏览(61)
  • 简单的用Python抓取动态网页数据,实现可视化数据分析

    一眨眼明天就周末了,一周过的真快! 今天咱们用Python来实现一下动态网页数据的抓取 最近不是有消息说世界首富马上要变成中国人了吗,这要真成了,可就是历史上首位中国世界首富了! 那我们就以富豪排行榜为例,爬取一下2023年国内富豪五百强,最后实现一下可视化分

    2024年02月05日
    浏览(34)
  • 『爬虫四步走』手把手教你使用Python抓取并存储网页数据!

    爬虫是Python的一个重要的应用,使用Python爬虫我们可以轻松的从互联网中抓取我们想要的数据,**本文将基于爬取B站视频热搜榜单数据并存储为例,详细介绍Python爬虫的基本流程。**如果你还在入门爬虫阶段或者不清楚爬虫的具体工作流程,那么应该仔细阅读本文! 第一步:

    2024年02月04日
    浏览(41)
  • Python网络爬虫库:轻松提取网页数据的利器

          网络爬虫是一种自动化程序,它可以通过访问网页并提取所需的数据。Python是一种流行的编程语言,拥有许多强大的网络爬虫库。在本文中,我们将介绍几个常用的Python网络爬虫库以及它们的使用。 Requests库 Requests是一个简单而优雅的HTTP库,可以轻松地发送HTTP请求。

    2024年02月09日
    浏览(33)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(35)
  • 网页视频抓取插件-自动网页视频抓取插件

    网页视频抓取插件 ,什么是网页视频抓取插件。相信很多朋友在互联网上都遇到很多比较好的视频,但是视频又没有下载链接,自己有很想保存视频。怎么办呢?今天给大家分享一款免费的网页视频插件。只需要输入域名,软件自动抓取视频,支持批量抓取下载。导出到本地

    2024年02月02日
    浏览(37)
  • 用UiPath实现网页抓取——表格数据提取-1-单击选择分类-ISO标准化-01-综合、术语、标准化、文献目录获取

    准备获取目录的链接是 全国标准信息公告服务平台链接: https://std.samr.gov.cn/search/iso?tid=q= 第一步,标注啊类型选择——ISO 第二步,标准化状态选择——现行 第三步,ICS分类选择——01_综合、术语标准化、文献 将数据分别复制到excel文件中,如下图。 由于国际标准分类号在

    2024年02月04日
    浏览(39)
  • vue2使用axios封装请求数据,教会你封装,简单易懂,轻松学会axios封装请求数据 看一眼就会 手把手教会

    2、完成上面的步骤还不够,还需要再创建一个文件夹api,然后在文件夹里面创建自定义的文件名(我创建的是cartApi.js)文件名根据自己的需求命名 下面就是根据自己的请求接口以及数据参数请求,下面的请求是一些常见的post、get请求以及传参啥的(仅供参考,可以参考下面

    2024年01月24日
    浏览(33)
  • 轻松爬取网页数据:低代码&零编程技巧的自动化爬虫神器!

    在以前的文章中,我们学习了通过playwright+python+requests可以实现绕过浏览器鉴权进行接口请求。 在曾经的一次数据爬取的时候,我尝试去获取Boss直聘的岗位信息,可是很不巧,boss直聘的反爬机制把我的IP直接封了,妙啊。 在这里给大家推荐一款工具:亮数据。 他可以使用真

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包