Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
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>aaa@qq.com</email>
<loginname>zhangsan</loginname>
<pwd>123456</pwd>
<age>18</age>
</user>
<user isAdmin="false">
<name>李四</name>
<email>aaa@qq.com</email>
<loginName>lisi</loginName>
<pwd>456789</pwd>
<age>20</age>
</user>
<user isAdmin="true">
<name>王五</name>
<email>aaa@qq.com</email>
<loginName>wangwu</loginName>
<pwd>123456</pwd>
<age>22</age>
</user>
<user isAdmin="false">
<name>赵六</name>
<email>aaa@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.使用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方式解析
,用这个来获取指定的内容真是太方便了!
以上纯属个人见解,如有问题请联系本人!