一、xml简介
1、定义
xml 即为可扩展标记语言。
2、特点
xml 是具有自描述结构的半结构化数据。
3、作用
xml 设计宗旨主要是用来传输数据,还可以作为了一些应用配置文件。
二、xml和html的区别
1、语法要求不同:xml 的语法要求更严格
(1)html不区分大小写
(2)html有时不严格,如果上下文清楚地显示出段落或者标签在何处结束,可以省略尾标签。但是xml不能 省略任何标签。
(3)只有xml中有自闭标签。—只能有属性,没有内容的标签。
(4)在html中属性名可以不带属性值,xml中必须带。
(5)在xml中属性必须用引号括起来,html可以不加引号
2、作用不同
xml主要用来传输数据,html主要用来显示数据。
3、标记不同
xml没有固定的标记,html的标签都是有特殊含义的,不能自定义。
三、xpath
1、什么是xpath
xpath是一种提取 xml 内容的语法,可用来在xml文档中对元素和属性进行遍历。
2、xml和html中的几个名词
元素:一整个标签:标签的名字+属性+内容+后代标签
3、xpath的语法
(1)选取节点
表达式 | 描述 |
---|---|
nodename | 选取此标签及所有子标签 |
/ | 从根节点开始找 |
// | 从任意位置开始找,不考虑他们的位置 |
**.*• | 当前节点 |
*•• | 当前节点的父节点 |
@ | 选取属性 |
text() | 选取内容 |
(2)谓语
谓语的作用:限定
表达式 | 描述 |
---|---|
[] | 写在元素后面,就是用来限定这个元素的 |
[@class=“abc”] | class属性为abc的元素 |
[@id = “aaa”] | id属性为aaa的元素 |
[1] | 第一个元素 |
[last()] | 选后一个元素 |
[last()-1] | 倒数第二个元素 |
[position()>2] | 选取位置大于2的元素 |
book[positon()>2] | 从第三个book元素开始选取 |
[contains(属性名a,属性值b)] | 属性a包含b的标签 |
(3)通配符
•—任意元素
@*—任意属性
(4)选取若干路径
//title**|**//price —选取所有的title和price标签
四、lxml模块
python用来解析xml和html文档的模块。
1、安装
pip install lxml
2、使用lxml解析字符串
# 导入模块
from lxml import etree
#解析字符串
text = """
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
"""
#把字符串变成element对象
tree = etree.HTML(text)
print(tree) # <Element html at 0x3c62bc8>
#把element对象变成字符串
print(etree.tostring(tree,pretty_print=True).decode('utf-8'))
element对象可以调用xpath()方法来筛选内容,element.xpath()–>返回值是一个列表。
#选取标签内容
a_text = tree.xpath('//a[@href="link1.html"]/text()')
print(a_text) # ['first item'] #
#选取属性
a_href = tree.xpath('//ul/li[@class="item-inactive"]/a/@href')
print(a_href) # ['link3.html']
如果选取的是元素,那么xpath方法返回的还是element,同样的这个element元素还是可以继续用xpath 方 法来筛选元素的。
#选取元素
#选取所有的li标签
li_list = tree.xpath('//ul/li')
print(li_list) #获取每一个li标签的a标签的内容
for li in li_list:
text = tree.xpath('.//a/text()')
print(text)