XML 素材:http://www.cnblogs.com/zhangboblogs/p/10114698.htm
除了直接读取字符串,lxml 还支持从文件里读取内容。我们新建一个 hello.html 文件,再利用 etree.parse()方法来读取文件。
注意:从文件中读取数据,要求文件内容符合 xml 格式,如果标签缺失,则不能正常读取。
四、XPath 节点信息解析:
# 安装lxml: pip install lxml
# 1. 导入etree: 两种导入方式
# 第一种: 直接导入
from lxml import etree
# 注意: 此种导入方式,可能会导致报错(etree下面会出现红色波浪线,不影响正常使用)
# 第二种:
# from lxml import html
# etree = html.etree
str ='<bookstore>'\
'<book>'\
'<title src="https://www.baidu.com">Harry Potter</title>'\
'<price>29.99</price>'\
'</book>'\
'<book>'\
'<title>Learning XML</title>'\
'<price>39.95</price>'\
'</book>'\
'<book>'\
'<title>西游记</title>'\
'<price>69.95</price>'\
'</book>'\
'<book>'\
'<title src="https://www.jd.com">水浒传</title>'\
'<price>29.95</price>'\
'</book>'\
'<book>'\
'<title src="https://www.jd.com">三国演义</title>'\
'<price>29.95</price>'\
'</book>'\
'</bookstore>'
# 2. etree.HTML() 将字符串转换成HTML元素对象,可以自动添加缺失的元素
html = etree.HTML(str) # <Element html at 0x1e17b839708> 是一个el对象
#print(html)
# 3. 方法:
# 3.1 tostring() 查看转换之后的内容(二进制类型)
# 如果想要查看字符串,需要解码
# 如果想要显示汉字,需要先编码,再解码
# content = etree.tostring(html,encoding='utf-8')
#print(content.decode())
# 3.2 xpath()方法 作用:提取页面数据,返回值是一个列表
# xpath的使用一定是建立在etree.HTML()之后的内容中的
# xpath是如何来提取页面数据的?
# 答:使用的是路径表达式
# 3.2.1 xpath路径分为两种:
# 第一种: / 代表一层层的查找,如果/存在于开头,代表根路径
# bookstore = html.xpath('/html/body/bookstore')
#print(bookstore) # [<Element bookstore at 0x2dd535efb88>]
# 第二种:// 任意路径 焦点在元素身上
# 例如:查找bookstore标签
# bookstore = html.xpath('//bookstore')
#print(bookstore) # [<Element bookstore at 0x1639054fdc8>]
# 第一种和第二种结合
# 例如:查找所有book标签
# book = html.xpath('//bookstore/book')
#print(book) # [<Element book at 0x2737fd7fa48>, <Element book at 0x2737fd7fc88>, <Element book at 0x2737fd7fcc8>, <Element book at 0x2737fd7fd08>, <Element book at 0x2737fd7fd88>]
# 3.2.2 /text() 获取标签之间的内容
# 例如:获取所有title标签的内容
# 步骤:
# 1. 找到所有title标签
# 2. 获取内容
# title = html.xpath('//book/title/text()')
#print(title) # ['Harry Potter','Learning XML','西游记','水浒传','三国演义']
# 3.3 位于 使用[] 可以理解成条件
# 3.3.1 [n] 代表获取第n个元素,n是数字,n<=1
# 例如: 获取第二个title标签
# title = html.xpath('//book[2]/title/text()')
# title1 = html.xpath('//title[2]/text()')
#print(title) # ['Learning XML']
#print(title1) # []
# last() 获取最后一个
# 同理: last()-1 获取倒数第二个
# 例如: 获取最后一本书的title标签之间的内容
# title = html.xpath('//book[last()]/title/text()')
# title1 = html.xpath('//book[last()-1]/title/text()')
#print(title) # ['三国演义']
#print(title1) # ['水浒传']
# 3.3.2 position() 位置,范围 支持 > / < / = / >= / <= / !=
# 例如: 获取最后两本书的title标签之间的内容
# 步骤:
# 1. 先获取后两本书
# 2. 获取内容
# title = html.xpath('//book[position()>3]/title/text()')
#print(title) # ['水浒传','三国演义']
# ? title = html.xpath('//book[position()>last()-2]/title/text()')
#print(title) # ['水浒传','三国演义']
# 3.3.3 获取属性值:@属性名
# 例如: 获取lang属性值为cng的title标签的内容
# title = html.xpath('//book/title[@lang="cng"]/text()')
#print(title) # ['西游记']
# 例如: 获取包含src属性得title标签的内容
# title = html.xpath('//book/title[@src]/text()')
#print(title) # ['Harry Potter','水浒传','三国演义']
# 例如: 获取包含属性的title标签的内容
# title = html.xpath('//book/title[@*]/text()')
#print(title) # ['Harry Potter','Learning XML','西游记','水浒传','三国演义']
# 例如: 获取最后一个title标签的src属性的值
# title = html.xpath('//book[last()]/title/@src')
#print(title) # ['https://www.jd.com']
相关阅读 >>
更多相关阅读请进入《Python》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。