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
相关产品推荐
相关产品推荐

