You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用ElementTree解析URL XML时遇Parse Error求助

问题原因

你遇到的xml.etree.ElementTree.ParseError: no element found: line 1, column 0错误,核心原因是HTTPResponse是单向流对象:你先用for line in fhand遍历完了所有响应内容,此时流的指针已经移动到末尾,后续调用ET.parse(fhand)时,没有任何数据可以读取,自然解析失败。

解决方案

有两种简单的修复方式:

方式1:先读取全部内容到内存,再解析

把HTTPResponse的内容一次性读取为字节数据,再用ET.fromstring()直接解析(推荐这种,更直观):

import xml.etree.ElementTree as ET
import urllib.request

# 获取响应并读取全部内容
response = urllib.request.urlopen('https://py4e-data.dr-chuck.net/comments_42.xml')
xml_content = response.read()

# 计算总字节数(对应你原来的sum逻辑)
print(len(xml_content))

# 解析XML
xtree = ET.fromstring(xml_content)

# 后续处理逻辑不变
lst = xtree.findall('comments/comment')
print('count:', len(lst))

flist = []
for item in lst:
    num = item.find('count').text
    flist.append(int(num))

print(sum(flist))

方式2:直接用ET.parse处理流,避免提前遍历

如果你一定要保留流的处理方式,不要提前遍历fhand,直接传给ET.parse:

import xml.etree.ElementTree as ET
import urllib.request

fhand = urllib.request.urlopen('https://py4e-data.dr-chuck.net/comments_42.xml')

# 直接解析流,不要提前遍历
xtree = ET.parse(fhand)
xroot = xtree.getroot()

lst = xtree.findall('comments/comment')
print('count:', len(lst))

flist = []
for item in lst:
    num = item.find('count').text
    flist.append(int(num))

print(sum(flist))
关于你尝试的字符串转换问题

ET.parse()确实只接受类文件对象或文件路径,不能直接传字符串。如果要处理字符串格式的XML,应该用ET.fromstring(),但需要先把字节数据解码为字符串(注意XML的编码,通常是utf-8):

xml_str = xml_content.decode('utf-8')
xtree = ET.fromstring(xml_str)

内容的提问来源于stack exchange,提问作者sim67fb333

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:07:28