一、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提供一些帮助。