使用BeautifulSoup解析XML文档
有200多个XML文档,每个文档类似如下:
- <?xml version="1.0"?>
- <VehicleInfo>
- <FileHeader>
- <ScaleInfo>
- <SN>H00120030101081526</SN>
- <UserName>盛隆钢铁</UserName>
- <ScaleName>2#</ScaleName>
- <ScaleID>H001</ScaleID>
- <ScaleType>铁水秤开关</ScaleType>
- <WeighingType>铁水秤开关</WeighingType>
- <MeasureTime>2003-01-01 08:15:26</MeasureTime>
- <NodeNumber>2</NodeNumber>
- <WaveFile>20030101081424.wave</WaveFile>
- <VideoFile>20030101081424.wave</VideoFile>
- <Orientation>右方向来车<<<<<<</Orientation>
- <OperatorName>Admin</OperatorName>
- <SUMWeight>0</SUMWeight>
- </ScaleInfo>
- </FileHeader>
- <FileBody>
- <Node>
- <ID>1</ID>
- <_DateTime>2003-1-1 8:14:25</_DateTime>
- <VehicleType />
- <VehicleCardID />
- <Speed>17.5</Speed>
- <Weight>3.12</Weight>
- <FrontAxisWeight>.00</FrontAxisWeight>
- <BackAxisWeight>.00</BackAxisWeight>
- <InsideWheel1>.00</InsideWheel1>
- <OutsideWheel1>.00</OutsideWheel1>
- <InsideWheel2>.00</InsideWheel2>
- <OutsideWheel2>.00</OutsideWheel2>
- <InsideWheel3>.00</InsideWheel3>
- <OutsideWheel3>.00</OutsideWheel3>
- <InsideWheel4>.00</InsideWheel4>
- <OutsideWheel4>.00</OutsideWheel4>
- <Temperature>0123</Temperature>
- <Humidity>0123</Humidity>
- <PIC1>_1.bmp</PIC1>
- <PIC2>_2.bmp</PIC2>
- <PIC3>_3.bmp</PIC3>
- <PIC4>_4.bmp</PIC4>
- </Node>
- <Node>
- <ID>2</ID>
- <_DateTime>2003-1-1 8:14:26</_DateTime>
- <VehicleType />
- <VehicleCardID />
- <Speed>15.8</Speed>
- <Weight>4.77</Weight>
- <FrontAxisWeight>.00</FrontAxisWeight>
- <BackAxisWeight>.00</BackAxisWeight>
- <InsideWheel1>.00</InsideWheel1>
- <OutsideWheel1>.00</OutsideWheel1>
- <InsideWheel2>.00</InsideWheel2>
- <OutsideWheel2>.00</OutsideWheel2>
- <InsideWheel3>.00</InsideWheel3>
- <OutsideWheel3>.00</OutsideWheel3>
- <InsideWheel4>.00</InsideWheel4>
- <OutsideWheel4>.00</OutsideWheel4>
- <Temperature>0123</Temperature>
- <Humidity>0123</Humidity>
- <PIC1>_1.bmp</PIC1>
- <PIC2>_2.bmp</PIC2>
- <PIC3>_3.bmp</PIC3>
- <PIC4>_4.bmp</PIC4>
- </Node>
- </FileBody>
- </VehicleInfo>
现在要提取MeasureTime、NodeNumber、Orientation以及每个Node下面的Weight,最后计算左方向和右方向总次数和总节数,以及每个方向的总重与差。如果使用C#,代码不知道要多长,那就用Python吧~
- #!/usr/bin/env python
- #-*- coding:utf-8 -*-
- __author__ = 'liulixiang'
- from bs4 import BeautifulSoup
- import glob
- left, left_times, left_weight = 0, 0, 0.0
- right, right_times, right_weight = 0, 0, 0.0
- files = sorted(glob.glob(r'E:\工作\work-documents\2013凤矿计量系统\Debug\WY.WeightBridge.Data\*.xml'))
- for index, filename in enumerate(files, 1):
- file = open(filename, encoding='utf-8').read()
- soup = BeautifulSoup(file, 'xml')
- print(index, '时间', soup.MeasureTime.string, '节数:', int(soup.NodeNumber.string), '方向:', soup.Orientation.string)
- for node in soup.FileBody.findChildren('Node'):
- print('\t序号:', node.ID.string, '重量:', node.Weight.string)
- if soup.Orientation.string == '左方向来车>>>>>>':
- left_weight += float(node.Weight.string)
- elif soup.Orientation.string == '右方向来车<<<<<<':
- right_weight += float(node.Weight.string)
- if soup.Orientation.string == '左方向来车>>>>>>':
- left += int(soup.NodeNumber.string)
- left_times += 1
- elif soup.Orientation.string == '右方向来车<<<<<<':
- right += int(soup.NodeNumber.string)
- right_times += 1
- print('\n')
- print('左方向来车共{}次,共{}节,总皮重{:.2f}'.format(left_times, left, left_weight))
- print('右方向来车共{}次,共{}节, 总毛重{:.2f}'.format(right_times, right, right_weight))
- print('总净重:%.2f' % (right_weight - left_weight))
注意:
1、soup = BeautifulSoup(file, 'xml'),因为BeautifulSoup默认解析HTML,所以解析XML时需要声明。
2、BS解析XML依赖lxml,windows下可以到这里下载二进制版本的lxml库。
3、BS的children()返回的是NavigableString,用findChildren可以返回tag。
这世上诱惑(五花八门的编程语言)太多,请抵制诱惑,今天这个语言流行(go说你呢)用这个,明天那个语言流行就用那个。人应该驾驭语言,而非语言来驾驭人。自勉!
使用BeautifulSoup解析XML文档的更多相关文章
- python优秀库 - 使用xmltodict解析xml文档
上次讲到如何使用BeautifulSoup解析XML文档,今天发现另外一个python库xmltodict(https://github.com/martinblech/xmltodict)也很简单. ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 使用dom4j解析XML文档
dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- java解析xml文档(dom)
DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...
- java 解析XML文档
Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...
- DOM生成XML文档与解析XML文档(JUNIT测试)
package cn.liuning.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.D ...
- [置顶] stax解析xml文档的6种方式
原文链接:http://blog.csdn.net/u011593278/article/details/9745271 stax解析xml文档的方式: 基于光标的查询: 基于迭代模型的查找: 基于过 ...
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...
随机推荐
- php执行shell更新svn文件的方法
vim /etc/sudoers 修改内容如下: #Defaults !visiblepw Defaults visiblepw #Defaults requiretty <?php set_t ...
- speex 回声消除的用法
speex 回声消除的用法 分类: speex AEC 回声消除 2012-11-13 11:24 1336人阅读 评论(0) 收藏 举报 speex的回声消息 就是speex_echo_cancel ...
- 2015 11 26 java 配置环境变量
使用java软件, 须进行改变配置环境变量.需要2步. 第一,在电脑中找到配置环境变量的位置: 我的电脑,属性,高级,环境变量. 第二,进行添加两个变量,更改一个变量: 1,变量名:JAVA_HOME ...
- Android学习路线(二十)运用Fragment构建动态UI
要在Android系统上创建一个动态或者多面板的用户界面,你须要将UI组件以及activity行为封装成模块.让它可以在你的activity中灵活地切换显示与隐藏. 你可以使用Fragment类来创建 ...
- js小写转实现资本,js数字革命万元
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <hea ...
- 一些ASP.NET的小知识点
DataFormatString="{0:格式字符串}" 我们知道在DataFormatString 中的 {0}表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式; ...
- asp.net 连接access数据库方法
在 Web.Config 中配置 Access 数据库驱动和数据库文件名称. 请看代码 <appSettings> <add key="DBDriver" val ...
- Dojo实现Tabs页报错(一)
1.在用Dojo写tab页的过程中出现了一些错误 dojo源码如下: <%-- Document : grid Created on : 2013-12-15, 18:05:47 Author ...
- mysql 多重游标嵌套
1.DECLARE CONTINUE HANDLER FOR NOT FOUND 在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND ...
- (转)C++中extern “C”含义深层探索
(转)C++中extern “C”含义深层探索 转自: http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html 1.引言 C++语 ...