您的位置:

XPath用法详解

一、XPath

XPath(XML Path Language)是一种基于XML的语言,它用于定位XML中的数据。XPath可以通过元素和属性来遍历XML文档,并根据有关元素和属性的信息来选择想要的内容。

在Python中,可以使用第三方库lxml来使用XPath,相应地,我们可以通过lxml中的etree对象来实现XPath表达式的解析、查询和操作。

from lxml import etree

# 构建解析器
parser = etree.HTMLParser()

# 解析网页
html = etree.parse("http://www.example.com", parser)

# 用XPath表达式提取所有a标签的href属性
links = html.xpath("//a/@href")

二、使用XPath方法的返回类型是

使用XPath方法的返回类型主要有以下几种:

1. 字符串类型

如果XPath表达式查询的是纯文本内容,返回的则是字符串类型,例如在下面的HTML代码中,如果我们要提取“Hello World”这段文本内容,XPath表达式则为“//p/i/text()”。

<html>
  <body>
    <p><i>Hello World</i></p>
  </body>
</html>

2. 列表类型

如果XPath表达式查询的是多个元素,那么返回的则是一个列表类型,例如在下面的HTML代码中,如果我们想要提取所有的链接,XPath表达式则为“//a/@href”。

<html>
  <body>
    <a href="http://www.example.com">Example Site</a>
    <a href="http://www.example.com/blog">Blog</a>
    <a href="http://www.example.com/about">About Us</a>
  </body>
</html>

3. 布尔类型

如果XPath表达式查询的是是否存在某个元素或者属性,那么返回的则是一个布尔类型,例如在下面的HTML代码中,如果我们想要判断是否存在id为“main”的元素,XPath表达式则为“boolean(//div[@id='main'])”。

<html>
  <body>
    <div id="main"></div>
  </body>
</html>

三、XPath定位

XPath定位主要指在XML或HTML文档中使用XPath表达式定位元素和属性。XPath表达式可以通过以下方式定位元素:

1. 标签名称

我们可以通过标签名称来定位元素,例如在下面的HTML代码中,如果我们想要定位所有的段落标签p,XPath表达式则为“//p”。

<html>
  <body>
    <p>This is the first paragraph.</p>
    <p>This is the second paragraph.</p>
  </body>
</html>

2. 属性

我们可以通过元素的属性来定位元素,例如在下面的HTML代码中,如果我们想要定位所有class属性值为“message”的div元素,XPath表达式则为“//div[@class='message']”。

<html>
  <body>
    <div class="message">Hello World!</div>
    <div class="message">Welcome to my website!</div>
  </body>
</html>

3. 父元素

我们可以通过元素的父元素来定位元素,例如在下面的HTML代码中,如果我们想要定位第二个span元素,XPath表达式则为“//div[@class='article']//span[2]”。

<html>
  <body>
    <div class="article">
      <span>Title 1</span>
      <span>Content 1</span>
    </div>
    <div class="article">
      <span>Title 2</span>
      <span>Content 2</span>
    </div>
  </body>
</html>

四、XPath插件

XPath插件可以通过添加一些函数和操作符来扩展XPath的功能。在Python中,可以使用第三方库lxml的XPath插件来实现更加复杂的XPath表达式。

例如,如果我们想要查询文档中包含某些特定单词的所有段落,可以使用lxml的XPath插件,其中“contains”函数可以用来判断一个元素是否包含某些文本内容。

import re
from lxml import etree

# 自定义contains函数
def contains(text, words):
    pattern = "|".join(words)
    return re.search(pattern, text) is not None

# 添加contains函数到XPath插件
etree.XPathEvaluator.add_function('contains', contains)

# 查询文档中包含特定单词的所有段落
html = etree.fromstring("<html><body><p>hello world</p><p>goodbye</p></body></html>")
paragraphs = html.xpath("//p[contains(.,['hello', 'goodbye'])]")

五、XPath读法

XPath的读法和语法类似于一个查询语言,主要包含以下几个部分:

1. 轴

轴指的是元素与其祖先、子孙以及同级元素之间的关系。例如,“/轴::parent::*/child::p”表示选择所有的段落元素的父元素。

2. 选择器

选择器用来选择元素和属性。例如,“/html/body/p”表示选择html元素下的body元素下的所有段落元素。

3. 谓语

谓语用来限定选择器的范围。例如,“//div[@class='message']”表示选择所有class属性值为“message”的div元素。

六、XPath方法的使用

XPath方法可以用来操作元素和属性,主要包括以下几个方法:

1. text()

text()方法用来获取元素的文本内容,例如,“//p/text()”表示获取所有段落元素中的文本内容。

2. @

@方法用来获取元素的属性值,例如,“//a/@href”表示获取所有链接的href属性值。

3. count()

count()方法用来获取元素的数量,例如,“count(//p)”表示获取所有段落元素的数量。

七、XPath翻译

XPath翻译是指将XPath表达式转换成其他语言的表达式,例如在Python中,可以使用lxml的XPath函数将XPath表达式转换成Python语言的表达式。

from lxml import etree

# 将XPath表达式转换成Python语言的表达式
expr = etree.XPath("//a/@href")
code = expr._compile()
print(code.co_code)

八、XPath爬虫

XPath在网页爬虫中应用广泛,它可以通过对网页进行解析和查询来抽取所需的信息。使用Python和lxml,我们可以实现一个简单的XPath爬虫。

import requests
from lxml import etree

# 请求网页
response = requests.get("http://www.example.com")

# 构建解析器
parser = etree.HTMLParser()

# 解析网页
html = etree.HTML(response.text, parser)

# 提取网页中的段落内容
paragraphs = html.xpath("//p/text()")
for paragraph in paragraphs:
    print(paragraph)

九、XPath定位文本

XPath定位文本主要指定位文本节点的位置信息。在XPath中,使用“text()”方法来定位文本节点,例如,“//p/text()”表示选择所有段落元素中的文本内容。

十、XPath正则表达式选取

XPath可以使用正则表达式来选取匹配的节点,例如,“//p[contains(text(), 'regexp:Hello.*')]/text()”表示选择所有段落元素中匹配“Hello.*”正则表达式的文本内容。

小结

本文对XPath用法进行了详细的阐述,涉及到了XPath的概述、使用方法、定位元素与属性、XPath插件、XPath读法、XPath方法的使用、XPath翻译、XPath爬虫、XPath定位文本和XPath正则表达式选取等方面的内容。希望能够为大家使用XPath提供一些帮助。