如何使用python获取引号中的值

如何使用python获取引号中的值,python,Python,我有一个XML文件,我在XML文件的数据中进行了解析,得到如下列表: 湿度数据=“湿度:73%” icon data=“/ig/images/weather/cloudy.gif” 风况数据=“风速:每小时5英里时为N” 我想编写一个python代码,在这里我只能捕获引号中的值并将其放入列表中 上面显示的并不是一个列表,所以我们需要知道数据对象的真实外观。例如,如果您将示例放在单个字符串中,如: 'humidity data="Humidity: 73%" icon data="/ig/imag

我有一个XML文件,我在XML文件的数据中进行了解析,得到如下列表:

湿度数据=“湿度:73%” icon data=“/ig/images/weather/cloudy.gif” 风况数据=“风速:每小时5英里时为N”


我想编写一个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)

这将使用非贪婪匹配来查找与起始引号和结束引号匹配的所有子字符串,中间的文本使用括号获取。请参见此处正则表达式的完整详细信息:

以下代码显示了如何使用正则表达式解析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

下面将从您的响应中提取所有条件块,并在DICT列表中返回它们。从那里你可以得到你需要的任何东西

#!/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
#/usr/bin/env python
从xml.etree.ElementTree导入xml
导入系统
data=”“”
"""
tree=XML(数据)
条件=tree.findall(“天气/当前条件”)
结果=[]
对于c,在以下条件下:
curr_results={}
对于c.getchildren()中的子对象:
curr_results[child.tag]=child.get('data')的值
结果。追加(当前结果)
打印结果

以下代码将使用数据元素提取所有元素并将其转换为字典:

>>> 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%
在一个名为“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"/>
没别的了

我知道很多XML解析器的教士都会说,你必须使用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'}

你的意思是“引用”而不是“coats”?你能发布原始XML文档吗?原始XML文件的内容是:将XML文档粘贴到你的问题的编辑中。还显示用于解析XML的代码。。。你的名单不是很有帮助。
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')
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'}