使用ElementTree解析XML导致CSV文件为空

0 投票
2 回答
751 浏览
提问于 2025-05-18 21:20

我刚开始学习Python,所以我参考了好几个教程来写这段代码。代码确实生成了一个.csv文件,但文件是空的(0kb)。我发现其他遇到这个问题的人是因为忘记关闭文件,但我这儿似乎不是这个问题。我很感激任何提示。

这是相关的xml文件,如果有帮助的话: https://api.nextbike.net/maps/nextbike-live.xml?city=14

import xml.etree.ElementTree as ET
import csv

tree = ET.parse('nextbike-live.xml')
root = tree.getroot()

with open('Bike_pos.csv', 'w') as Bike_pos:
    csvwriter = csv.writer(Bike_pos)
    bike_head = []

    count = 0
    for member in root.findall('place'):
        bike = []
        if count == 0:
            station = member.find('name').tag
            bike_head.append(station)
            lat = member.find('lat').tag
            bike_head.append(lat)
            lon = member.find('lng').tag
            bike_head.append(lon)
            bikeno = member.find('bike_numbers').tag
            bike_head.append(bikeno)
            count = count + 1

        station = member.find('name').text
        bike.append(station)
        lat = member.find('lat').text
        bike.append(lat)
        lon = member.find('lng').text
        bike.append(lon)
        bikeno = member.find('bike_numbers').text
        csvwriter.writerow(bike)
Bike_pos.close()

相关问题:

  • 暂无相关问题
暂无标签

2 个回答

0

为了让事情更简单,你也可以这样试试:

import requests
import csv
from lxml.html import fromstring

with open("Bike_Details.csv","w",newline="") as infile:
    writer = csv.writer(infile)
    writer.writerow(["station","lat","lng","bike_num"])

    res = requests.get("https://api.nextbike.net/maps/nextbike-live.xml?city=14")
    root = fromstring(res.content)
    for items in root.cssselect("country city place"):
        station = items.get("name")
        lat = items.get("lat")
        lng = items.get("lng")
        bike_num = items.get("bike_numbers")
        print(station,lat,lng,bike_num)
        writer.writerow([station,lat,lng,bike_num])
0

我得到了一个好朋友的帮助。我的xml源文件里有几个子元素,但我的代码没有去查找它们。

他给了我这段代码,效果非常好,而且比我之前的代码简单多了:

import xml.etree.ElementTree as ET
import csv

tree = ET.parse('nextbike-live-test.xml')
root = tree.getroot()

with open('Bike_pos.csv', 'w') as Bike_pos:
    csvwriter = csv.writer(Bike_pos)

    #CSV Header
    csvwriter.writerow(['Station', 'lat', 'lng', 'Bikes'])

    #Add info about each station
    for country in root.findall('country'):
        for city in country.findall('city'):
            for place in city.findall('place'):
                bike = []

                bike.append(place.get('name'))
                bike.append(place.get('lat'))
                bike.append(place.get('lng'))
                bike.append(place.get('bike_numbers'))
                csvwriter.writerow(bike)

撰写回答