查看原文
其他

解析XML文件

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张   宇

文字编辑:余术玲

技术总编:张   邯 

重磅!!!爬虫俱乐部将于2019年10月2日至10月5日在湖北武汉举行Python编程技术培训,本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python编程技术,尤其是爬虫技术和文本分析技术。该培训目前在火热招生中,点击《爬虫俱乐部2019十一Python编程技术培训报名啦!》或点击文末阅读原文,了解培训详细信息,抓紧时间报名吧!
XML是由万维网联盟(W3C)创建的标记语言,被设计用来传输和存储数据,XML可以自行定义标签,具有自我描述性,其设计宗旨是传输数据,而非显示数据。
Python自带XML模块,方便开发者解析XML数据。XML模块中包含了广泛使用的API接口--------SAX和DOM等。另外,lxml解析库同样支持HTML和XML的解析,而且支持XPath解析方式。总的来说,Python解析XML的常用方法有以下几种:
1、DOM解析,xml.dom.*模块。
2、SAX解析,xml.sax.*模块。
3、ET解析,xml.etree.ElementTree模块。
4、lxml解析并结合XPath提取元素。
由于第四种方法是我们在网络爬虫时解析html经常用到的,也是我们较为熟悉的,所以首先尝试用它来解析xml,另外三种方法也将陆续介绍。


一、生成XML文件
我们使用sublime编辑器编辑一个名为test的xml文件,将其存储在D盘。具体文件内容如下图所示:

可以看到,XML文件中存储的是爬虫俱乐部近期将要举办的stata培训的信息。但是,XML仅仅在存储数据的时候非常方便,其在展示数据的时候则显得捉襟见肘。下面,我们将简单介绍XPath语法,并结合lxml将XML文件中的信息数据解析出来。

二、XPath语法简单介绍

XPath是一门在XML文档中查找信息的语言,Xpath通过路径表达式在XML文档中进行导航。在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点,以下作简单介绍。

XML元素使用XML标签进行定义,标签就是<head>、<body>、<table>等被尖括号“<”和“>”包起来的对象,绝大部分的标签都是成对出现的,如<table></table>。元素则包括开始标签、结束标签以及里面的内容,如”<to>students</to>”就是元素。页面中的所有内容都是节点,在上面的例子中,“<train>”是文档(根)节点;“price="物超所值!!!"”则为属性(节点);“中国武汉”则是文本(节点)。同时,“<location>中国 武汉</location>”和“<to>students</to>”同为<train>的子孙元素,而“<location>中国 武汉</location>”则是“<body>”的直接子元素。

上述为XPath的一些基础概念,而XPath的常用语法如下(下面用到的div和body都是标签名):
1、/div:在根节点下边查找直接子元素。
2、//div:在根节点下边查找子孙元素。
3、//div//body:获取所有div标签里所有的body标签。
4、//div[@price]:获取含有price属性的div标签。
5、//div[@price = 10]:获取prices属性等于10的div标签。
6、//div/@price:获取div标签的属性。
7、//div/text():获取div标签的文本。
关于XPath的专门介绍请关注爬虫俱乐部后续推文。


三、提取XML文件中的信息
1、导入相关标准库
from lxml import etree
2、定义解析器
parser = etree.XMLParser(encoding = "utf-8")
3、使用解析器parser解析XML文件
#传入两个参数,第一个参数是文件名,第二个参数是解析器。tree = etree.parse(r"D:/test.xml",parser = parser)#查看解析出的tree的内容print(etree.tostring(tree,encoding = 'utf-8').decode('utf-8'))
结果如下:

可以发现,我们成功将XML文件的全部内容解析出来。
4、结合xpath提取XML文件中的信息
(1)此次培训是python培训还是stata培训?
name = tree.xpath("//heading/text()")[0]  #由于xpath语法返回的是列表,因此要用切片将信息提取出来,下同。print(name)
结果如下:

(2)此次培训的时间?
time = tree.xpath("//body/time/text()")[0] print(time)
结果如下:

(3)此次培训的地点?
location = tree.xpath("//location/text()")[0]print(location)
结果如下:

(4)此次培训的价格?
price = tree.xpath("//body/@price")[0]print(price)
结果如下:

以上就是我们结合xpath和lxml解析XML的过程,此方法同样适用于网络爬虫中解析html,希望对大家有所帮助。


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

        命令更新之 reg2docx:将回归结果输出到word

命令更新之t2docx——报告分组均值t检验

爬虫俱乐部2019十一Python编程技术培训报名啦!

数据类型——Dict、Set与Frozenset简析

数据类型介绍——tuple、list和range对象

把pdf文件批量转成docx文件

格式化字符串方法的比较

        朝花夕拾—— 如何输出内存中的矩阵与绘图

        Stata16新功能——定义图形元素的绝对大小

        将数值型计算“一网打尽”——(1)

        Stata16新功能之“框架”——读入多个数据集(1)

       手持Python,斗图不输!

       朝花夕拾——cnstock与cntrade强强联合

   

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存