我正在尝试使用Beautiful Soup从Python中的某些XML中提取值(但是如果推荐的话,我会兴高采烈地将其转储给其他任何东西)。考虑以下代码;
global humidity, temperature, weatherdescription, winddescription
query = urllib2.urlopen('http://www.google.com/ig/api?weather="Aberdeen+Scotland"')
weatherxml = query.read()
weathersoup = BeautifulSoup(weatherxml)
query.close()
print weatherxml
这样就可以将苏格兰阿伯丁的天气预报打印成XML(目前)(为了防止文字综合症的巨大障碍,大量的XML被删除);
<?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="Aberdeen, Aberdeen City"/><postal_code data=""Aberdeen Scotland""/><latitude_e6
data=""/><longitude_e6 data=""/><forecast_date
data="2012-07-31"/><current_date_time data="1970-01-01 00:00:00
+0000"/><unit_system data="US"/></forecast_information><current_conditions><condition
data="Clear"/><temp_f data="55"/><temp_c data="13"/><humidity
data="Humidity: 82%"/><icon
data="/ig/images/weather/sunny.gif"/><wind_condition data="Wind: SE at
8 mph"/></current_conditions>
现在,我希望能够使用此XML中的天气值填充变量,例如make temperature = 13.解析它是一场噩梦。
如果我在weathersoup上使用任何find函数,我会获得整个标记(例如,对于temp_c,它返回"<temp_c data="13">
),各种其他函数不返回任何内容,或整个工作表或部分函数。
如何为任何给定的XML标记返回VALUE,没有乱七八糟的“条带”,或者使用正则表达式,或者基本上是黑客攻击它?
答案 0 :(得分:2)
要访问元素data
中的属性temp_c
:
weathersoup.temp_c['data']
答案 1 :(得分:0)
使用lxml
,并与XPath保持友好关系。这个示例中的一些对您提供的XML没有意义,因为它没有正确解析...但希望它能让您了解XPath的强大功能。
from lxml import etree
# xmlstr is the string of the input XML data
root = etree.fromstring(xmlstr)
# print the text in all current_date_time elements
for elem in root.xpath('//current_date_time'):
print elem.text
# print the values for every data attribute in every temp_c element
for value in root.xpath('//temp_c@data'):
print value
# print the text for only the temp_c elements whose data element is 'Celsius'
for elem in root.xpath('//temp_c[@data="Celsius"]'):
print elem.text
# print the text for only the temp_c elements that are under the temperatures element, which is under the root.
for elem in root.xpath('/temperatures/temp_c'):
print elem.text