2016-04-09 1 views
1

Ich bin neu in der Programmierung und Python und versuche, die Anzahl der verfügbaren Fahrräder an einer bestimmten Station im DC Bikeshare-Programm zuzugreifen. Ich glaube, dass das mit BeautifulSoup der beste Weg ist. Die gute Nachricht ist, dass die Daten in verfügbar sind, was erscheint hier ein sauberes Format zu sein: https://www.capitalbikeshare.com/data/stations/bikeStations.xmlBeautifulSoup für den Zugang zu verfügbaren Bikes in DC bikeshare

Hier ist ein Beispiel einer Station:

<station> 
    <id>1</id> 
    <name>15th & S Eads St</name> 
    <terminalName>31000</terminalName> 
    <lastCommWithServer>1460217337648</lastCommWithServer> 
    <lat>38.858662</lat> 
    <long>-77.053199</long> 
    <installed>true</installed> 
    <locked>false</locked> 
    <installDate>0</installDate> 
    <removalDate/> 
    <temporary>false</temporary> 
    <public>true</public> 
    <nbBikes>7</nbBikes> 
    <nbEmptyDocks>8</nbEmptyDocks> 
    <latestUpdateTime>1460192501598</latestUpdateTime> 
</station> 

ich bin für den <nbBikes> Wert suchen. Ich hatte, was ich dachte, wäre der Beginn eines Python-Skripts, das mir den Wert für die ersten 5 Stationen zeigen würde (ich werde mich damit beschäftigen, die Station auszuwählen, die ich will, sobald ich das unter Kontrolle habe), aber es gibt keine Werte zurück. Hier ist das Skript:

# bikeShareParse.py - parses the capital bikeshare info page 


import bs4, requests 

url = "https://www.capitalbikeshare.com/data/stations/bikeStations.xml" 

res = requests.get(url) 
res.raise_for_status() 

#create the soup element from the file 
soup = bs4.BeautifulSoup("res.text", "lxml") 

# defines the part of the page we are looking for 
nbikes = soup.select('#text') 

#limits number of results for testing 
numOpen = 5 
for i in range(numOpen): 
     print nbikes 

Ich glaube, dass mein Problem (neben nicht verstehen, wie Code zu formatieren korrekt in einem Stapelüberlauf Frage) ist, dass der Wert für nbikes = soup.select('#text') falsch ist. Ich kann jedoch nichts für "#text" ersetzen, um irgendwelche Werte zu erhalten, geschweige denn die, die ich möchte.

Bin ich das richtig? Wenn ja, was fehlt mir?

dank

+0

, wenn Sie die Daten im XML-Format erhalten Sie versuchen, es mit xmletree. – bhansa

+0

Danke! Es sieht so aus, als ob ein großer Teil meines Problems versucht hätte, BeautifulSoup für xml zu verwenden. Ich habe versucht, ein neues Skript zu erstellen, das im Grunde folgendes ist: 'import xml.etree.ElementTree als ET tree = ET.ElementTree ('https://www.capitalbikeshare.com/data/stations/bikeStations.xml') root = tree.getroot() print root' – mweinberg

+0

Dies gibt die URL zurück. Der Versuch, tiefer in die Struktur mit Zeilen wie 'root1 = ET.fromstring ('station') print root1 'zu kommen, bringt mir Syntaxfehler. – mweinberg

Antwort

0

Dieses Skript erstellt ein Wörterbuch mit der Struktur [STATION_ID, bikes_remaining]. Es ist von Anfang an von dieser Änderung: http://www.plotsofdots.com/archives/68

# from http://www.plotsofdots.com/archives/68 


import xml.etree.ElementTree as ET 
import urllib2 

#we parse the data using urlib2 and xml 
site='https://www.capitalbikeshare.com/data/stations/bikeStations.xml' 
htm=urllib2.urlopen(site) 
doc = ET.parse(htm) 

#we get the root tag 
root=doc.getroot() 
root.tag 

#we define empty lists for the empty bikes 
sID=[] 
embikes=[] 
#we now use a for loop to extract the information we are interested in 
for country in root.findall('station'): 
    sID.append(country.find('id').text) 
    embikes.append(int(country.find('nbBikes').text)) 

#this just tests that the process above works, can be commented out 
#print embikes 
#print sID 

#use zip to create touples and then parse them into a dataframe 
prov=zip(sID,embikes) 

print prov[0] 
+1

Sollte keine Antwort sein, es sei denn, es sortiert das Problem – hd1