一、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提供一些帮助。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/241330.html
微信扫一扫
支付宝扫一扫