2017-04-22 21 views
0

私はいくつかのWeb廃棄の例をしようとしています。私はウェブサイトからデータをダウンロードし、そのデータはxmlとそのようなもので構成されています。xmlから必要なデータを抽出する方法

ValCurs Date="20.04.2016" name="Official exchange rate"> 
<Valute ID="47"> 
<NumCode>978</NumCode> 
<CharCode>EUR</CharCode> 
<Nominal>1</Nominal> 
<Name>Euro</Name> 
<Value>22.4023</Value> 
</Valute> 
<Valute ID="44"> 
<NumCode>840</NumCode> 
<CharCode>USD</CharCode> 
<Nominal>1</Nominal> 
<Name>US Dollar</Name> 
<Value>19.7707</Value> 
</Valute> 
. 
. 
. 
. 
. 

25以上の通貨があります。

換算レートを表す通貨名と値のみを抽出したいと思います。 50日間のデータがあり、この50日間の各通貨の平均為替レートを計算したいと考えています。 データをダウンロードしてxmlファイルに保存します。私のコードは以下の通りです。

import os 
import requests as rq 
from bs4 import BeautifulSoup 
from xml.etree import ElementTree as ET 


def saveData(path, date): 
    session = rq.session() 
    url = 'https://www.bnm.md/en/official_exchange_rates?get_xml=1&date=' + date 
    datastore = session.get(url) 
    with open(path, 'wb') as f: 
     f.write(datastore.content) 
    value = ET.fromstring('/home/robbin/Desktop/20.04.2016.xml').find('Name/value') 
    if value: 
     print 'Found value:', value.text 

def main(): 
    dates = ['20.04.2016', '21.04.2016', '22.04.2016'] 
    paths = [] 
    for date in dates: 
     path = '/home/robbin/Desktop/{}.xml'.format(date) 
     paths.append(path) 
    for path, date in zip(paths, dates): 
     saveData(path, date) 


if __name__ == '__main__': 
    main() 

私はこのエラーを得た: 昇給ERR

xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0 

私の問題は、私はこのXMLデータから名前と値のデータを抽出することができませんということです。私はSOとインターネットのいくつかの例を見ましたが、私の場合とはかなり異なっています。誰かが助けることができれば、それは素晴らしいことでしょう。

答えて

0

fromstring(...)は、指定された文字列を解析します。したがって、XMLコンテンツの代わりにパスを解析します。

は次のようになります。

value = ET.fromstring(datastore.content).find('Name/value') 

の作業例:

def saveData(path, date): 
    session = rq.session() 
    url = 'https://www.bnm.md/en/official_exchange_rates?get_xml=1&date=' + date 
    datastore = session.get(url) 
    with open(path, 'wb') as f: 
     f.write(datastore.content) 
    data = ET.fromstring(datastore.content) 

    for element in data.iter(): 
     if element.tag in ('Name', 'Value'): 
      print("%s - %s" % (element.tag, element.text)) 
+0

私はあなたのソリューションを試しましたが、それは返されていないまたは画面上の何も印刷されていないと、nabazは、XMLが適切にフォーマットされていないことを言及します。私はこのデータをウェブサイトから入手し、コードはURLの中に与えられます – robbin

+0

投稿された 'savedData'関数を試してください... –

+0

ありがとう、それは今働いていて、xmlタグから値を抽出できます。あなたは私の日を救う。元気な一日 – robbin

0

ここで正しくXMLに対処すれば、問題はxmlが正しくフォーマットされていないことです。最初の行1と列0は、問題が発生している場所です。冒頭に開始タグ「<」があるはずです。

+0

は、私がウェブサイトからこの情報が指定されているすべてのページの上にこのデータを得ました。 "このXMLファイルにはスタイル情報は関連付けられていないようです。文書ツリーは以下のように表示されます。" ...........正しくフォーマットする方法はわかりません。何か案が。ウェブサイトはコード内のURLに記載されています。 – robbin

関連する問題