-2

Python で urllib2 と sre を使用して aprs.fi からのデータを解析しているので、作業中のリアルタイムの高高度気球コードで気象データを使用できます。解析コードは非常に単純です。

import urllib2
import sre

APRStracking = urllib2.urlopen( "http://api.aprs.fi/api/get?name=KD8REX&what=loc&apikey=42457.M4AFa3hdkXG31&format=xml" )

APRSxml = APRStracking.read()

latitude = sre.findall( '<la.*>(.*)</la.*>', APRSxml )
print latitude

解析しようとしているデータは、次のような XML です。

<xml>
   <command>get</command>
   <result>ok</result>
   <what>loc</what>
   <found>1</found>
   <entries>
      <entry>
         <name>KD8REX</name>
         <type>l</type>
         <time>1339339410</time>
         <lasttime>1339339410</lasttime>
         <lat>41.95550</lat>
         <lng>-83.65567</lng>
         <altitude>2204.62</altitude>
         <course>15</course>
         <speed>15</speed>
         <symbol>/O</symbol>
         <srccall>KD8REX</srccall>
         <dstcall>APT311</dstcall>
         <status>UofM H.A.S. - Go Blue!</status>
         <status_lasttime>1339339600</status_lasttime>
         <path>WIDE1-1,WIDE3-3,qAR,W8SGZ</path>
      </entry>
   </entries>
</xml>

私は Python にあまり詳しくありませんが、ser.findall() については、APRSxml を調べて正規表現に一致する文字列を検索し、リスト "latitude" の括弧内にあるものを追加するということを理解しています。したがって、この例では、正規表現に一致する 2 つの値は「lasttime」と「lat」です。ただし、このコードを実行すると、<lat>値ではなく値のみが出力されます<lasttime>。率直に言って、コードが機能するために本当に必要なのはこれだけですが、好奇心から、期待どおりに動作しない理由を誰かに教えていただければ幸いです。ありがとう。

4

4 に答える 4

4

パラメータを見ると、formを指定できることに気づきましたform=xml。に変更してjson見てみると、JSONが表示されます。

{
  "command":"get",
  "result":"ok",
  "what":"loc",
  "found":1,
  "entries":[
    {
      "name":"KD8REX",
      "type":"l",
      "time":"1339339410",
      "lasttime":"1339339410",
      "lat":"41.95550",
      "lng":"-83.65567",
      "altitude":"2204.62",
      "course":"15",
      "speed":"15",
      "symbol":"\/O",
      "srccall":"KD8REX",
      "dstcall":"APT311",
      "status":"UofM H.A.S. - Go Blue!",
      "status_lasttime":"1339339600",
      "path":"WIDE1-1,WIDE3-3,qAR,W8SGZ"
    }
  ]
}

解析は簡単です。XMLよりも簡単:

import urllib2, json

url = 'http://api.aprs.fi/api/get?name=KD8REX&what=loc&apikey=42457.M4AFa3hdkXG31&format=json'
data = json.loads(urllib2.urlopen(url).read())

for entry in data['entries']:
  print 'Latitude:', entry['lat']

作業はとても簡単です。data単なるPython辞書です。

于 2012-06-26T04:18:41.743 に答える
0

Python には、このタスクに最適な使いやすい XML パーサーが含まれています。

>>> import urllib2
>>> from xml.etree.ElementTree import parse
>>> APRStracking = urllib2.urlopen("http://api.aprs.fi/api/get?name=KD8REX&what=loc&apikey=42457.M4AFa3hdkXG31&format=xml")
>>> tree = parse(APRStracking)
>>> tree.find('entries/entry/lat').text
'41.95550'
于 2012-06-26T05:27:45.240 に答える
0

貪欲な星を遅延マッチ (*?) に変更する必要があります。

>>> re.findall('<la.*?>(.*?)</la.*?>', APRSxml )
['1339339410', '41.95550']

現在起こっていることは、式の残りの部分が一致を見つけることができるように<la.*>、最初laの出現から最後の出現までのすべてに一致することです。>だから、<la.*>マッチ

<lasttime>1339339410</lasttime><lat>

lasttime 値が報告されない理由を説明します。

于 2012-06-26T04:07:52.890 に答える
0

この貪欲でないバージョンを試してください:

latitude = re.findall('<la.*?>(.*?)</la.*?', APRSxml)
>>> print latitude
['1339339410', '41.95550']

しかし、「緯度」が必要な場合は、これを実行してみませんか?

latitude = re.findall('<lat>(.*?)<', APRSxml)
于 2012-06-26T04:08:17.303 に答える