2011-02-28 72 views
0

我有一個XML文件,我在XML文件中的數據分析得到如下列表獲取引號值:如何使用python

溼度數據=「溼度:73%」 圖標數據= 「/ig/images/weather/cloudy.gif」 wind_condition data =「Wind:N at 5 mph」

我想編寫一個python代碼,我只能捕獲引號中的值並將其放入列表中。

+0

你的意思是「行情」,而不是「大衣「? – 2011-02-28 21:56:32

+0

有關該錯誤是的,對不起... – 2011-02-28 21:59:54

+0

你能發佈原始XML文檔? – 2011-02-28 22:07:31

回答

0

上面顯示的內容並不是真正的列表,因此我們需要知道數據對象的外觀。舉例來說,如果你有一個字符串的例子,如:

'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

1

以下代碼顯示如何使用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'] 
0

下面將提取所有條件阻止你的迴應,在類型的字典列表返回它們。從那裏你可以得到你需要的任何東西。

#!/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 
0

這裏的代碼,將提取所有元素有一個數據元素,並將它們轉換成詞典:

>>> 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% 
0

有了這個文本(請注意,我在末尾添加<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'}