欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)

程序员文章站 2022-06-16 20:18:14
...

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包
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
然后找到正确被安装的模块
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
查找当前实际类的ElementTree.py中的源码
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
发现其中的属性
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
发现其中可以使用的方法
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
通过发现源码和实际的类的方式,我们可以对具有这个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方法获取指定标签的内容

结果如下:
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)

4.使用lxml解析html文件并获取指定的内容

这里使用的是xpath技术,如果不懂就先去看xpath的用法!

1.首先找到一个html页面(本人找的是当前百度新闻的内容!)
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
本人需要获取其中的文本,首先将当前的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编码

结果如下:
Python3:使用lxml库来解析xml文件和html文件(使用xpath方式解析)
解析成功!

6.总结

1.在使用任何一个没有见过的模块的时候,需要自己安装并最好找到源码,和其中对应的类型

2.通过尝试执行方法的方式执行代码,使用当前的lxml库解析xml的时候很快

3.在使用lxml解析html的时候使用xpath方式解析,用这个来获取指定的内容真是太方便了!

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