JAVA中XPATH取值数据对象_4,xpath获取数据
xpath
XPath 使⽤路径表达式在 XML ⽂档中进⾏导航.
XPath 使⽤路径表达式来选取 XML ⽂档中的节点或者节点集。这些路径表达式和我们在常规的电脑⽂件系统中看到的表达式⾮常相似。
1) 可在XML中查信息
2) ⽀持HTML的查
3) 通过元素和属性进⾏导航
安装
Windows
#pip安装
pip3 install lxml
#wheel安装
pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl
Linux
yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
pip3 install lxml
术语
节点(Node)
在 XPath 中,有七种类型的节点:元素、属性、⽂本、命名空间、处理指令、注释以及⽂档(根)节点。XML ⽂档是被作为节点树来对待的。树的根被称为⽂档节点或者根节点。
XPath的使⽤⽅法
nodename 选取此节点的所有⼦节点
/ 从当前节点选取直接⼦节点
// 从当前节点选取⼦孙节点
. ⽤来选取当前节点
.. 选取当前节点的⽗节点
@ 选取属性
*    通配符,选择所有元素节点与元素名
@*  选取所有属性
[@attrib]选取具有给定属性的所有元素
[@attrib='value']选取给定属性具有给定值的所有元素
[tag]选取所有具有指定元素的直接⼦节点
[tag='text']选取所有具有指定元素并且⽂本内容是text节点
/text() 获取当前路径下的⽂本内容
/
@xxxx 提取当前路径下标签的属性值
| 可选符 使⽤|可选取若⼲个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
另外还有starts-with(@属性名称,属性字符相同部分),string(.)两种重要的特殊⽅法
使⽤
读取⽂本解析节点
from lxml import etree
text='''
'''
html=etree.HTML(text) #初始化⽣成⼀个XPath解析对象
string(html,encoding='utf-8') #解析对象输出代码
print(type(html))
print(type(result))
print(result.decode('utf-8'))
#etree会修复HTML⽂本节点
读取HTML⽂件进⾏解析
from lxml import etree
html=etree.parse('test.html',etree.HTMLParser()) #指定解析器HTMLParser会根据⽂件修复HTML⽂件中缺失的如声明信息string(html) #解析成字节
#stringlist(html) #解析成列表
print(type(html))
print(type(result))
print(result)
#
b'\n
\n
\n
\n
\n
\n
\n
\n
\n
\n'
获取节点
html=etree.parse('test',etree.HTMLParser())
result=html.xpath('//*') #//代表获取⼦孙节点,*代表获取所有
html.xpath('//li') #获取所有⼦孙节点的li节点
result=html.xpath('//li/a') #通过追加/a选择所有li节点的所有直接a节点,因为//li⽤于选中所有li节点,/a⽤于选中li节点的所有直接⼦节点a
##获取⽗节点
查⽗节点可以使⽤..来实现也可以使⽤parent::来获取⽗节点
text='''
'''
html=etree.HTML(text,etree.HTMLParser())
result=html.xpath('//a[@href="link2.html"]/../@class')
result1=html.xpath('//a[@href="link2.html"]/parent::*/@class')
属性匹配
#⽤@符号进⾏属性过滤
from lxml import etree
import HTMLParser
text='''
'''
html=etree.HTML(text,etree.HTMLParser())
result=html.xpath('//li[@class="item-1"]')
print(result)
获取节点后的结果为列表
string(result[0]))
b'
\n '
string(result[0]).decode('utf-8'))
获取⽂本
from lxml import etree
text='''
'''
html=etree.HTML(text,etree.HTMLParser())
result=html.xpath('//li[@class="item-1"]/a/text()') #获取a节点下的内容
result1=html.xpath('//li[@class="item-1"]//text()') #获取li下所有⼦孙节点的内容
print(result)
print(result1)
获取属性
使⽤@符号即可获取节点的属性,如下:获取所有li节点下所有a节点的href属性
result=html.xpath('//li/a/@href') #获取a的href属性
result=html.xpath('//li//@href') #获取所有li⼦孙节点的href属性
多属性值匹配
如果某个属性的值有多个时,我们可以使⽤contains()函数来获取
from lxml import etree
text1='''
'''
html=etree.HTML(text1,etree.HTMLParser())
result=html.xpath('//li[@class="aaa"]/a/text()')
result1=html.xpath('//li[contains(@class,"aaa")]/a/text()')
print(result)
print(result1)
#通过第⼀种⽅法没有取到值,通过contains()就能精确匹配到节点了
[]
['第⼀个']
多属性匹配
根据多个属性确定⼀个节点,这时就需要同时匹配多个属性,此时可⽤运⽤and运算符来连接使⽤from lxml import etree
text1='''
'''
html=etree.HTML(text1,etree.HTMLParser())
result=html.xpath('//li[@class="aaa" and @name="fore"]/a/text()')
result1=html.xpath('//li[contains(@class,"aaa") and @name="fore"]/a/text()') print(result)
print(result1)
#
['second item']
['second item']
XPath中的运算符
运算符
描述
实例
返回值
or
age=19 or age=20
如果age等于19或者等于20则返回true反正返回false
and
age>19 and age<21
如果age等于20则返回true,否则返回false
mod
取余
5 mod 2
1
|
取两个节点的集合
//book | //cd
返回所有拥有book和cd元素的节点集合
+
6+4
>java修改html文件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。