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>[email protected]</email>
        <loginname>zhangsan</loginname>
        <pwd>123456</pwd>
        <age>18</age>
    </user>
    <user isAdmin="false">
        <name>李四</name>
        <email>[email protected]</email>
        <loginName>lisi</loginName>
        <pwd>456789</pwd>
        <age>20</age>
    </user>
    <user isAdmin="true">
        <name>王五</name>
        <email>[email protected]</email>
        <loginName>wangwu</loginName>
        <pwd>123456</pwd>
        <age>22</age>
    </user>
    <user isAdmin="false">
        <name>赵六</name>
        <email>[email protected]</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方式解析,用这个来获取指定的内容真是太方便了!

以上纯属个人见解,如有问题请联系本人!

发布了215 篇原创文章 · 获赞 39 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/103481551