1.前言
今天知道了一个python的xml解析库,所以今天决定学习当前lxml库!
2.安装当前的lxml
pip install lxml
由于本人下载不下来
所以直接在官网下载文件直接安装的
3.简单的使用当前的lxml解析xml文件
1.首先创建一个需要被解析的xml文件,users.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user isAdmin="true">
<name>张三</name>
<email>zhangsan@qq.com</email>
<loginname>zhangsan</loginname>
<pwd>123456</pwd>
<age>18</age>
</user>
<user isAdmin="false">
<name>李四</name>
<email>lisi@qq.com</email>
<loginName>lisi</loginName>
<pwd>456789</pwd>
<age>20</age>
</user>
<user isAdmin="true">
<name>王五</name>
<email>wangwu@qq.com</email>
<loginName>wangwu</loginName>
<pwd>123456</pwd>
<age>22</age>
</user>
<user isAdmin="false">
<name>赵六</name>
<email>zhaoliu@qq.com</email>
<loginName>zhaoliu</loginName>
<pwd>456789</pwd>
<age>18</age>
</user>
</users>
这是一个测试的数据模拟的
2.开始导入lxml模块
from lxml import etree
然后开始解析
def parse_xml(xml=str):
users_xml = etree.parse(xml)
root_el = users_xml.getroot()
for el in root_el:
print(el)
file_name = "users.xml"
parse_xml(file_name)
发现显示的类型为:<Element user at 0x18ad8a232c8>
,现在由于使用的idea不能很好的发现其中的属性和方法(没有提示)
3.尝试查看源码获取解决办法
首先找到安装的Lib包
然后找到正确被安装的模块
查找当前实际类的ElementTree.py中的源码
发现其中的属性
发现其中可以使用的方法
通过发现源码和实际的类的方式,我们可以对具有这个ELement类型的数据进行如下操作:
4.开始真正的解析操作:
def parse_xml(xml=str):
users_xml = etree.parse(xml)
root_el = users_xml.getroot()
for el in root_el:
print(el)
print("当前的标签:{},当前标签中具有的元素:{}".format(el.tag, el.attrib))
name = el.findtext("name")
email = el.findtext("email")
loginName = el.findtext("loginName")
pwd = el.findtext("pwd")
age = el.findtext("age")
print("用户名:{0},密码:{1},真实姓名:{2},邮箱:{3},年龄:{4}".format(loginName, pwd, name, email, age))
file_name = "users.xml"
# content = open_users_xml(file_name)
parse_xml(file_name)
1.我们通过el获取的每一个元素都为user标签,通过tag获取这个标签的名称
2.通过当前的元素的attrib获取其中具有的属性
3.通过findtext方法获取指定标签的内容
结果如下:
4.使用xpath方式解析当前的xml文件中的内容
def parse_xml_use_xpath(xml=str):
users_xml = etree.parse(xml)
print(type(users_xml))
root_el = users_xml.getroot()
print("根标签的名称为:{}".format(root_el.tag))
first_username = root_el.find(".//name")
print("获取的当前根元素的第一个元素的name标签中的内容为:{}".format(first_username.text))
# 获取所有的user标签
users = root_el.findall(".//user")
for user in users:
name = user.find("./name").text
email = user.find("./email").text
loginName = user.find("./loginName").text
pwd = user.find("./pwd").text
age = user.find("./age").text
print("用户名:{0},密码:{1},真实姓名:{2},邮箱:{3},年龄:{4}".format(loginName, pwd, name, email, age))
file_name = "users.xml"
parse_xml_use_xpath(file_name)
结果为:
获取指定结点中的内容
zhangsan_name = root_el.find(".//user[1]/name").text
zhangsan_pwd = root_el.find(".//user[1]/pwd").text
print("{}的密码为:{}".format(zhangsan_name, zhangsan_pwd))
结果为:
这里需要注意的是当前获取的user[1]的起始下标为1开始,不是0!
5.使用lxml解析html文件并获取指定的内容
这里使用的是xpath技术,如果不懂就先去看xpath的用法!
1.首先找到一个html页面(本人找的是当前百度新闻的内容!)
本人需要获取其中的文本,首先将当前的html文件拷贝进项目中!
# 用于使用当前的xpath对当前的html页面进行解析操作
# 主要使用的库位lxml
from lxml import etree
import os
file_name = "baidunews.html"
def handler_html_get_news_title(content=None):
if content is not None:
html = etree.HTML(content)
titles = html.xpath('//ul[@class="ulist focuslistnews"]//a')
print_collections(titles)
def print_collections(titles=()):
print("当前获取的数据的长度为:{}".format(len(titles)))
for title in titles:
print(title.text)
if not os.path.exists(file_name):
print("当前解析的文件不存在,请检查路径!")
else:
content = None
try:
with open(file_name, encoding='UTF-8') as file:
content = file.read()
except Exception as e:
print(e) # 'gbk' codec can't decode byte 0x80 in position 382: illegal multibyte sequence
handler_html_get_news_title(content)
当前解析出现了一个错误,好像就是这个:'gbk' codec can't decode byte 0x80 in position 382: illegal multibyte sequence
错误!解决的方法就是在读取的时候使用utf-8编码
结果如下:
解析成功!
6.总结
1.在使用任何一个没有见过的模块的时候,需要自己安装并最好找到源码,和其中对应的类型
!
2.通过尝试执行方法的方式执行代码,使用当前的lxml库解析xml的时候很快
3.在使用lxml解析html的时候使用xpath方式解析
,用这个来获取指定的内容真是太方便了!
以上纯属个人见解,如有问题请联系本人!