2017-04-22 5 views
0

Ich versuche, einige Web-Scrapping-Beispiele zu tun. Ich herunterladen Daten von einer Website und die Daten aus XML und sein Aussehen wie dieseSo extrahieren Sie die erforderlichen Daten aus 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> 
. 
. 
. 
. 
. 

gibt es mehr als 25 Währungen.

Ich möchte nur den Währungsnamen und den Wert, die den Wechselkurs darstellen, extrahieren. Ich habe Daten für 50 Tage und möchte den durchschnittlichen Wechselkurs jeder Währung für diese 50 Tage berechnen. Ich lade die Daten herunter und speichere sie in XML-Dateien. und mein Code ist wie folgt.

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() 

Ich habe diesen Fehler: Erhöhung err

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

Mein Problem ist, dass ich nicht in der Lage bin, den Namen und den Wert von Daten aus diesen XML-Daten zu extrahieren. Ich habe einige Beispiele über SO und Internet gesehen, aber sie sind ziemlich verschieden von meinem Fall. Wenn jemand helfen kann, wäre es großartig.

Antwort

0

fromstring(...) analysiert die angegebene Zeichenfolge. Es analysiert also den Pfad anstelle des XML-Inhalts.

Sollte sein:

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

Arbeitsbeispiel:

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

Ich habe versucht, Ihre Lösung, aber es ist nicht zurückgeben oder etwas auf dem Bildschirm drucken und Nabaz erwähnen, dass Xml nicht richtig formatiert ist. Ich habe diese Daten von einer Website und Website ist in der URL in den Code gegeben – robbin

+0

Versuchen Sie die gepostete 'savedData'-Funktion ... –

+0

vielen Dank, es funktioniert jetzt und ich kann Werte aus XML-Tags extrahieren. Du sparst meinen Tag. Hab einen schönen Tag – robbin

0

Wenn Sie das XML hier richtig behandelt haben, ist das Problem, dass die XML nicht richtig formatiert ist. Die erste Zeile 1 und die Spalte 0 sind wo das Problem ist. Es sollte am Anfang eine öffnende Markierung "<" sein.

+0

ich diese Daten von einer Website und verfügt über jede Seite diese Informationen gegeben. "Diese XML-Datei scheint keine Formatinformationen zu enthalten. Der Dokumentbaum ist unten abgebildet." ........... Ich weiß nicht, wie ich ihn richtig formatiere. Irgendeine Idee. Die Website ist in der URL im Code angegeben. – robbin

Verwandte Themen