【问题标题】:Requests returns 200 but ElementTree fails to parse empty root请求返回 200 但 ElementTree 无法解析空根
【发布时间】:2026-02-21 05:20:04
【问题描述】:

这是指向该 API 的链接,其 ID 由另一个 API 提供,它应该可以工作,但目前不能,因为他们还没有将其编入索引。问题是链接返回 200 和一个空的 xml 根。

xml link

我是 Python 的新手,但基本上问题是 ID 返回一个空的 XML 根,响应为 200,我可以看到它确实返回了一些东西但为空,并且 Elementtree 给了我错误:

带有response.text:

try:
    xml = r.text
    if xml:
        root = ElementTree.parse(xml)
except ElementTree.ParseError:

有错误: FileNotFoundError: [Errno 2] 没有这样的文件或目录:'\n\n\n'

还尝试了字节:

try:
    xml = r.content
    if xml:
        root = ElementTree.fromstring(xml)
except ElementTree.ParseError:

有错误: TypeError: Parser 必须是字符串或字符流,而不是 NoneType

我似乎无法触发捕获,因为它总是 200。如何在解析之前检查 xml 的有效性/存在性?

我有数以千计的文档要解析,而这个错误打破了这一切。

【问题讨论】:

  • 例外情况下我刚刚有一个随机打印语句*
  • 我不确定我是否完全理解您的问题,但总的来说,使用 try/except 进行流控制没有任何问题
  • @NomadMonad 这就是我的想法,但 IDK 为什么它没有按预期运行。基本上我只想解析返回的 xml,如果它是空的,请跳过它或忽略它。但是一直在尝试解析它
  • 页面没有问题;它包含一个只有一个标签的有效格式的 xml 文档。所以这真的是你如何定义“空”的问题 - 比特定数量的标签短?不包含某些预期信息?等等。一旦你定义了它,应该很容易创建一个if 语句来跳过这种类型的页面。
  • @JackFleeting 你会怎么做?对我来说看起来也有效,所以它应该是可解析的,但是在它被解析为 xml 之前如何检查它?你看到我的问题>如果不先解析它,我无法检查有效性,也许我做错了什么?

标签: python xml python-requests elementtree


【解决方案1】:

试试这样的:

url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=32277197&rettype=abstract"
import requests

from lxml import etree
resp = requests.get(url)

doc = etree.XML(resp.content)

floor = doc.xpath('count(//*)')
if floor < 3: #or whatever
     print("I'm outta here...")

编辑: 或使用 XML:

import xml.etree.ElementTree as ET
doc = ET.fromstring(resp.text)
floor = doc.findall(".//")
if len(floor) < 3:
    print("I'm outta here...")

输出:

I'm outta here...

【讨论】:

  • AttributeError: 'xml.etree.ElementTree.Element' 对象没有属性 'xpath' 这导致我这样做:*.com/questions/13455672/…
  • 我的错,那是 lxml 而不是 xml 库...,我只能使用 xml,所以也许我得想点别的办法。
  • 我想我明白了:它确实像你说的那样解析,但我需要像这样检查孩子的存在:children = list(root.iter()) if children: do something... ,这似乎有效