深入理解XPath:通配符、节点、函数

深入了解XPath的通配符、节点、函数,并提供了理解层次结构的方法。结合实际示例,轻松理解。

4,036
深入理解XPath:通配符、节点、函数
目录

0. 概述

在XPath第1部分中,我们讨论了在网络爬虫中必不可少的XPath概念和基本语法,而在第2部分中,我们将介绍XPath的深入内容。

1. 通配符理解

在深入内容之前,有必要理解XPath中“*(通配符)”的含义。

  • (通配符)在XPath中匹配任何元素,并用于选择所有元素。让我们通过示例来说明。
//div[contains(@class, "aa")]

上面的XPath表示选择具有包含'aa'的class名称的div元素。那么如果使用通配符代替div会怎样呢?

//*[contains(@class, "aa")]

在上面的XPath中,‘*’匹配所有元素,因此该XPath表示选择所有具有包含'aa'的class名称的元素。

2. XPath层次结构理解

现在让我们深入了解XPath的内容。

以下是一个简单的HTML代码示例。

<AAA>
    <BBB>
        <CCC/>
        <DDD/>
    </BBB>
    <EEE>
        <FFF>
            <GGG/>
            <GGG/>
            <III>
                <JJJ/>
            </III>
        </FFF>
    </EEE>
    <KKK>
        <LLL/>
    </KKK>
</AAA>

HTML代码中的每个元素和属性都形成层次关系,在XPath中,这种层次关系以树形结构表示。轴用于表示在树结构中引用和选择节点(数据点,单位)的方向或关系。轴包括self轴,parent轴,child轴等,我们将逐个使用示例进行说明。

将上述元素的层次结构绘制成图如下。

notion image

现在让我们通过使用轴来了解如何表示节点。

3. 节点的表示方法

3.1. self

: 表示当前节点本身。

/AAA/self::*

上面的XPath将选择当前节点<AAA>元素。

3.2. parent

: 表示当前节点的父节点。

/AAA/EEE/FFF/parent::*

上面的XPath将选择当前节点<FFF>元素的父节点<EEE>元素。

notion image

3.3. child : 表示当前节点的子节点。

/AAA/EEE/FFF/child::*

上面的XPath将选择当前节点<FFF>元素的子节点<GGG>, <GGG>, <III>。

notion image

如果想要仅选择<III>元素,可以修改XPath如下。

/AAA/EEE/FFF/child::III

此外,如果想要选择两个<GGG>元素中的第一个<GGG>元素,可以修改XPath如下。

/AAA/EEE/FFF/child::GGG[1]

需要注意的是,与大多数其他编程语言不同,XPath中的索引从1开始!

3.3. ancestor

: 表示当前节点的所有祖先节点。

/AAA/EEE/FFF/ancestor::*

上面的XPath将选择当前节点<FFF>元素的祖先节点<EEE>, <AAA>。

notion image

3.4. descendant

: 表示当前节点的所有后代节点。

/AAA/EEE/FFF/descendant::*

上面的XPath将选择当前节点<FFF>元素的后代节点<GGG>, <GGG>, <III>, <JJJ>。

notion image

3.5. ancestor-or-self

: 表示当前节点及其所有祖先节点。

/AAA/EEE/FFF/ancestor-or-self::*

上面的XPath将选择当前节点<FFF>元素本身及其祖先节点<FFF>, <EEE>, <AAA>。

3.6. descendant-or-self

: 表示当前节点及其所有后代节点。

/AAA/EEE/FFF/descendant-or-self::*

上面的XPath将选择当前节点<FFF>元素本身及其后代节点<FFF>, <GGG>, <GGG>, <III>, <JJJ>。

3.7. following

: 表示当前节点结束标记后的所有节点。

/AAA/EEE/following::*

上面的XPath将选择当前节点<EEE>结束后出现的节点<FFF>, <GGG>, <GGG>, <III>, <JJJ>, <KKK>, <LLL>。

notion image

3.8. preceding

: 表示当前节点开始标记前出现的所有节点。

/AAA/EEE/preceding::*

上面的XPath将选择当前节点<EEE>之前出现的节点<BBB>, <CCC>, <DDD>。

notion image

3.9. following-sibling

: 表示当前节点后续的所有同级节点。

/AAA/EEE/following-sibling::*

上面的XPath将选择当前节点<EEE>后续的同级节点<KKK>。

notion image

3.10. preceding-sibling

: 表示当前节点之前的所有同级节点。

/AAA/EEE/preceding-sibling::*

上面的XPath将选择当前节点<EEE>之前的同级节点<BBB>。

notion image

到目前为止,我们已经了解了XPath中用于表示节点的轴。

接下来,让我们了解另外两个可用于XPath的函数。

4. 用于XPath的函数

4.1. count

: 返回符合特定条件的节点数。

#class 속성 값이 ‘example인 div 요소의 개수를 반환
count(//div[@class="example"])
#p 요소의 총 개수를 반환
count(//p)

4.2. position

: 返回当前节点的位置。(位置从1开始逐渐增加)

&lt;root&gt;
  &lt;item&gt;Item 1&lt;/item&gt;
  &lt;item&gt;Item 2&lt;/item&gt;
  &lt;item&gt;Item 3&lt;/item&gt;
&lt;/root&gt;

例如,当存在以下xml代码时,可以编写如下XPath。

//item[position() = 2]

使用position函数可以选择三个item元素中的第二个item元素。

5. 结论

到目前为止,我们已经了解了XPath的深入内容。如果您从基础到深入都掌握了,那么您现在应该已经掌握了在XML文档中精确查找并提取数据所需的基本知识。

XPath是浏览和操作XML文档的强大工具,在实际工作中被广泛应用于数据抓取、网络抓取、基于XML的Web服务中的数据提取等各种领域。希望您能成功地使用XPath有效地提取和利用数据!

请阅读以下文章:

数据收集,现在自动化

无需编码,5分钟即可开始 · 5000多个网站爬取经验

免费开始 →

评论

发表评论

您的邮箱不会公开,仅用于回复通知。

继续阅读

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.