xpath获取标签的属性值_解析库之Xpath,pyquery

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    ']

你可能感兴趣的:(xpath获取标签的属性值)