什么是xml
(1)定义
xml称为可扩展标记性语言
(2)特点
xml具有自描述特性。是一种半结构化数据
(3)作用
xml的设计宗旨是用来传输数据
xml和html的区别
(1)语法要求不同:xml语法要求更严格
1.在html中不区分大小写,xml语法严格区分大小写
2.在html中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>标记。在xml中,是严格的树状结构,绝对不能省略任何标记。
3.在xml中,拥有单个标记而没有匹配的结束标记的元素必须用一个/字符作为结尾。<a href=’www’/>
4.在xml中,属性值必须分装在引号中。在html中,引号可用可不用。
5.在html中属性名可以不带属性值,xml必须带
6.xml文档中,空白部分不会被解析器自动删除,但是html是过滤掉空格
(2)作用不同:
xml主要用来传输数据。HTML主要用来显示数据,以及更好的显示数据
(3)标记不同:
xml没有固定标记。HTML的标签是固定的
xpath
(1)什么是xpath
xpath是一种语法,用来提取xml或者html页面内容的语法
xpath语法的内容
四个关键词
元素:指一个xml的标签以及标签的所有内容
属性:class,name
内容:a标签的内容就是aaa,b标签的内容就是bbb
标签:和元素一样。
1.选取节点
nodename ----选取此标签的所有子标签。
/ ----从根节点开始选取
// -----从任意位置开始选取。
. ---选取当前节点
.. ---选取父节点
@ ---选取属性
text() ---选取内容
2.谓语
xpath的谓语是限定选取的内容的。
/bookstore/book[1]--->表示取bookstroe下面的第一个book标签。
/bookstore/book[last()]--->表示取bookstroe下面的最后一个book标签
/bookstore/book[last()-1]--->表示取bookstroe下面倒数第二个book标签
/bookstore/book[position()>1]--->表示从bookstroe下面的第二本书开始取
//title[@lang] --->取一个有lang属性的title标签。
//title[@lang="eng"] --->取一个有lang属性,并且lang属性为eng的title标签。
3.选取未知节点
* --->匹配任意节点
@* --->匹配任意属性
4.选取若干路径
//title|//price ---> 选取所有的title标签和price标签。
python中使用
通过lxml模块,可以使用xpath语法来筛选元素。
#导包
from lxml import etree
(1)将字符串形式的xml内容解析成可以调用xpath语法的element对象的方法。
html_element = etree.HTML(html_str)
html_element.xpath()--->返回值也是一个element,表示还可以继续调用xpath方法来继续筛选元素。
etree.HTML()可以帮我们补齐标签内容。
(2)将一个html文件转化成element对象的方法。
from lxml import etree
html = etree.parse('demo.html')
# print(html)
print(etree.tostring(html,pretty_print=True,encoding='utf-8').decode('utf-8'))
当使用parse方法解析一个xml或者html文件时,语法必须严格按照xml的标签语法。标签必须对应。
xpath练习
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" class="a_class_1">aaaa</a>
<span class="span_item1">span_text1</span>
</li>
<li class="item-1">
test
<a href="link4.html" class="a_class_0">fourth item
<span class="span_item2">span_text2</span></a>
</li>
<li class="item-0">
<a href="link5.html" class="bold">fifth item</a>
</li>
</ul>
</div>
'''
'''
获取所有的 <li> 标签
继续获取<li> 标签的所有 class属性
继续获取<li>标签下href 为 link1.html 的 <a> 标签
获取<li> 标签下的所有 <span> 标签(包括孙子span)
获取 <li> 标签下的<a>标签里的所有 class
获取最后一个 <li> 的 <a> 的 href
获取倒数第二个元素的内容
获取 class 值为 bold 的标签名
'''
xpath_html = etree.HTML(text)
##获取所有的 <li> 标签
li_list = xpath_html.xpath('//li')
# print(li_list)
## 继续获取<li> 标签的所有 class属性
# for li in li_list:
# print(li.xpath('./@class'))
## 继续获取<li>标签下href 为 link1.html 的 <a> 标签
# for li in li_list:
# print(li.xpath('./a[@href="link1.html"]'))
## 获取<li> 标签下的所有 <span> 标签(包括孙子span)
span_list = xpath_html.xpath('//li//span')
# print(span_list)
## 获取 <li> 标签下的<a>标签里的所有 class
a_class_list = xpath_html.xpath('//li/a/@class')
# print(a_class_list)
## 获取最后一个 <li> 的 <a> 的 href
a_href_list = xpath_html.xpath('//ul/li[last()]/a/@href')
print(a_href_list)
## 获取倒数第二个元素的内容
second_list = xpath_html.xpath('//*[last()-1]/text()')
# print(second_list)
## 获取 class 值为 bold 的标签名
class_bold_list = xpath_html.xpath('//*[@class="bold"]')
for one in class_bold_list:
print(one.tag) ## 对象.tag:获取标签名