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

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

10
深入理解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多个网站爬取经验

免费开始 →

Comments

Add Comment

Your email won't be published and will only be used for reply notifications.

继续阅读

Get notified of new posts

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

Your email will only be used for new post notifications.