Xpath
#encoding='utf-8'
#XPath,全称XML Path Language,即XML 路径语言,它是一门在XML 文档中查找信息的语言。
#它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。
#XPath常用规则:nodename 选择此节点的所有子节点; / 从当前节点选择直接子节点;// 从当前节点选择子孙节点;
#. 选取当前节点;.. 选取当前节点的父节点; @ 选取属性
#使用之前,首先要确保安装好lxml 库
#在XPath 中,提供了100 多个函数,包括存取、数值、字符串、逻辑、节点、序列等处理功能,它们的具体作用可以参考:
# http://www.w3school.com/cn/xpath/xpath_functions.asp 。
#XPath轴的用法可以参考:http://www.w3school.com.cn/xpath/xpath_axes.asp。
#XPath 的用法,可以查看:http://www.w3school.com.cn/xpath/index.asp 。
#Python lxml 库的用法,可以查看http://lxml.de/。
#首先导人lxml库的etree模块,然后声明了一段HTML文本,调用HTML类进行初始化,构造一个XPath 解析对象。
#这里需要注意的是,HTML文本中的最后一个li 节点是没有闭合的,但是etree模块可以自动修正HTML 文本。
#调用tostring()方法即可输出修正后的HTML代码,结果是bytes类型。利用decode()方法将其转成str 类型.
#可以看到,经过处理之后, li 节点标签被补全,并且还向动添加了body 、html 节点。
from lxml import etree
text = '''
first item
second item
third item
fourth item
fifth item
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))
#直接读取文本文件进行解析,多了一个DOCTYPE 的声明
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result= etree.tostring(html)
print(result.decode('utf-8'))
#所有节点
result = html.xpath ('//*')
print(result)
#,此处匹配也可以指定节点名称。如果想获取所有li 节点
result = html.xpath('//li')
print(result)
print(result[0])
#子节点:我们通过/或//即可查找元素的子节点或子孙节点。假如现在想选择li 节点的所有直接a 子节点,
result = html.xpath('//li/a')
print(result)
#获取ul 节点下的所有子孙a 节点,可以这样实现:
result = html.xpath('//ul//a')
print(result)
#父节点可以用.. 来实现。
#现在首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性,注意..前的/
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)
#也可以通过parent::来获取父节点,注意加上*
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')
print(result)
#属性匹配,在选取的时候,我们还可以用@符号进行属性过滤。如果要选取class为item-1的li节点
result = html.xpath('//li[@]')
print(result)
#文本获取,我们用XPath中的text()方法获取节点中的文本,接下来尝试获取前面li 节点中的文本
#因为XPath中text()前面是/,而此处/的含义是选取直接子节点,很明显li的直接子节点都是a节点,文本都是在
#a节点内部的,所以这里匹配到的结果就是被修正的子节点内部的换行符,因为自动修正的li节点的尾标签换行了
result = html.xpath('//li[@]/text()')
print(result)#['\r\n ']
#如果想获取li节点内部的文本,就有两种方式,一种是先选取a节点再获取文本,另一种就是使用// 。
result = html.xpath('//li[@]/a/text()')
print(result)#['first item', 'fifth item']
result = html.xpath('//li[@]//text()')
print(result)#['first item', 'fifth item', '\r\n ']