0

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="&quot;Aberdeen Scotland&quot;"/><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 で天気の値を変数に入力できるようにしたいと考えています。

weathersoup で検索関数を使用すると、タグ全体 (たとえば、temp_c の場合は が返されます"<temp_c data="13">) が取得されますが、他のさまざまな関数では何も返されないか、シート全体またはその一部が返されます。

「ストリップ」を混乱させたり、正規表現に頼ったり、基本的にハッキングしたりせずに、特定の XML タグの VALUE を単純に返すにはどうすればよいですか?

4

2 に答える 2

2

dataelementの属性にアクセスするにはtemp_c:

weathersoup.temp_c['data']
于 2012-07-31T23:08:34.700 に答える
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
于 2012-07-31T23:18:10.443 に答える