我有一个XML文件,我在XML文件中的数据分析得到如下列表获取引号值:如何使用python
湿度数据=“湿度:73%” 图标数据= “/ig/images/weather/cloudy.gif” wind_condition data =“Wind:N at 5 mph”
我想编写一个python代码,我只能捕获引号中的值并将其放入列表中。
我有一个XML文件,我在XML文件中的数据分析得到如下列表获取引号值:如何使用python
湿度数据=“湿度:73%” 图标数据= “/ig/images/weather/cloudy.gif” wind_condition data =“Wind:N at 5 mph”
我想编写一个python代码,我只能捕获引号中的值并将其放入列表中。
上面显示的内容并不是真正的列表,因此我们需要知道数据对象的外观。举例来说,如果你有一个字符串的例子,如:
'humidity data="Humidity: 73%" icon data="/ig/images/weather/cloudy.gif" wind_condition data="Wind: N at 5 mph"'
您可以分析该字符串以获取所有引用的部分以列表如下:
import re
re.findall('\"(.+?)\"', in_string)
这将使用非贪婪匹配以查找匹配开始和结束引号的所有子字符串,使用括号提取两者之间的文本。请参阅正则表达式的完整详细信息:docs.python.org
以下代码显示如何使用proper XML parser解析XML。 xml流是根据您提供的部分信息重建的。
xml_strg = """<?xml version="1.0"?>
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >
<forecast_information>
<city data="Baton Rouge, LA"/>
<postal_code data="baton rouge,la"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2011-02-22"/>
<current_date_time data="2011-02-22 20:06:59 +0000"/>
<unit_system data="US"/>
</forecast_information>
<current_conditions>
<condition data="Cloudy"/>
<temp_f data="72"/>
<temp_c data="22"/>
<humidity data="Humidity: 73%"/>
<icon data="/ig/images/weather/cloudy.gif"/>
<wind_condition data="Wind: N at 5 mph"/>
</current_conditions>
</weather>
</xml_api_reply>
"""
import xml.etree.cElementTree as et
root = et.fromstring(xml_strg)
result = []
for elem in root.find('./weather/current_conditions'):
if elem.tag in ('humidity', 'icon', 'wind_condition'):
result.append(elem.get('data'))
print result
输出:
['Humidity: 73%', '/ig/images/weather/cloudy.gif', 'Wind: N at 5 mph']
下面将提取所有条件阻止你的回应,在类型的字典列表返回它们。从那里你可以得到你需要的任何东西。
#!/usr/bin/env python
from xml.etree.ElementTree import XML
import sys
data = """<?xml version="1.0"?>
<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
<forecast_information>
<city data="Baton Rouge, LA"/>
<postal_code data="baton rouge,la"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2011-02-22"/>
<current_date_time data="2011-02-22 20:06:59 +0000"/>
<unit_system data="US"/>
</forecast_information>
<current_conditions>
<condition data="Cloudy"/>
<temp_f data="72"/>
<temp_c data="22"/>
<humidity data="Humidity: 73%"/>
<icon data="/ig/images/weather/cloudy.gif"/>
</current_conditions>
</weather>
</xml_api_reply>
"""
tree = XML(data)
conditions = tree.findall("weather/current_conditions")
results = []
for c in conditions:
curr_results = {}
for child in c.getchildren():
curr_results[child.tag] = child.get('data')
results.append(curr_results)
print results
这里的代码,将提取所有元素有一个数据元素,并将它们转换成词典:
>>> from lxml import etree
>>> filePath = 'c:/test.xml'
>>> root = etree.parse(filePath)
>>> keypairs = dict((r.tag, r.get('data')) for r in root.xpath('//*[@data]'))
>>> print keypairs
{'city': 'Baton Rouge, LA', 'forecast_date': '2011-02-22', 'latitude_e6': '', 'l
ongitude_e6': '', 'temp_c': '22', 'humidity': 'Humidity: 73%', 'postal_code': 'b
aton rouge,la', 'unit_system': 'US', 'temp_f': '72', 'current_date_time': '2011-
02-22 20:06:59 +0000', 'condition': 'Cloudy', 'icon': '/ig/images/weather/cloudy
.gif'}
>>> print keypairs['humidity']
Humidity: 73%
有了这个文本(请注意,我在末尾添加<icon data="([^"]*)"/><wind_condition data="([^"]*)"/>
,因为这部分不是在文件的例子)称为 'joeljames.txt':
<?xml version="1.0"?><xml_api_reply version="1"><weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" ><forecast_information><city data="Baton Rouge, LA"/><postal_code data="baton rouge,la"/><latitude_e6 data=""/><longitude_e6 data=""/><forecast_date data="2011-02-22"/><current_date_time data="2011-02-22 20:06:59 +0000"/><unit_system data="US"/></forecast_information><current_conditions><condition data="Cloudy"/><temp_f data="72"/><temp_c data="22"/><humidity data="Humidity: 73%"/><icon data="/ig/images/weather/cloudy.gif"/><wind_condition data="Wind: N at 5 mph"/>
以下短代码
import re
with open('joeljames.txt','rb') as f:
RE = ('humidity data="([^"]*)"/>'
'<icon data="([^"]*)"/>'
'<wind_condition data="([^"]*)"/>')
print re.search(RE,f.read()).groups()
甚至
import re
print re.search(('humidity data="([^"]*)"/>'
'<icon data="([^"]*)"/>'
'<wind_condition data="([^"]*)"/>'),
open('joeljames.txt','rb').read()).groups()
有结果:
('Humidity: 73%', '/ig/images/weather/cloudy.gif', 'Wind: N at 5 mph')
罢了。
我知道比XML解析器的牧师会说,yoooou必须使用XML解析器,因为有一些非常有效,编码器必须是懒惰等等...... 他们是正确的,以防万一必须获得需要复杂的算法。
但是,如果这里有一个简单的目标,我认为有理由不求助于XML解析器,而且如果有人不知道使用XML解析器。你做 ?
对于我的解决方案,那么,你必须知道的正则表达式,是的......有必要当一个人想要做一些事情有一个最低的工具。 你的确懂得的语言太.....
可以使用解析器的解决方案,没有任何问题。但是现在你知道它也可以用正则表达式,你可以选择。
编辑:
为了回答批评者元素的顺序可能不总是相同的:
import re
print dict(re.findall('(humidity data|icon data|wind_condition data)'
'="([^"]*)"/>',open('joeljames.txt','rb').read()))
打印
{'humidity data': 'Humidity: 73%', 'icon data': '/ig/images/weather/cloudy.gif', 'wind_condition data': 'Wind: N at 5 mph'}
你的意思是“行情”,而不是“大衣“? – 2011-02-28 21:56:32
有关该错误是的,对不起... – 2011-02-28 21:59:54
你能发布原始XML文档? – 2011-02-28 22:07:31