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

SPARQLWrapper访问Uniprot SPARQL端点CONSTRUCT查询报ExpatError

报错根因

ExpatError: no element found: line 1, column 0是XML解析错误,代表传入解析器的响应内容为空、或不是合法XML格式,触发该问题的两个核心原因:

  • 代码中使用的Uniprot端点为HTTP协议地址,当前Uniprot SPARQL服务已强制跳转HTTPS,旧版本SPARQLWrapper默认不会自动处理SPARQL请求的30x类跳转,拿到的空响应直接传入XML解析器就会触发报错。
  • 未显式指定CONSTRUCT查询的返回格式:DBpedia端点对无格式声明的CONSTRUCT请求默认返回RDF/XML格式,刚好匹配SPARQLWrapper的默认解析逻辑;但Uniprot端点对无格式声明的CONSTRUCT请求默认返回Turtle格式RDF,不是XML结构,按XML规则解析自然失败。

SELECT查询不受影响是因为SPARQLWrapper对SELECT类查询默认请求SPARQL JSON格式返回,Uniprot端点对该格式请求的兼容性更好,即使走HTTP跳转也能正常返回内容。

修复方案

修改两处配置即可:

  1. 将端点地址替换为HTTPS协议地址,规避跳转问题
  2. 显式指定CONSTRUCT查询的返回格式,和解析逻辑对齐

修复后的可运行代码:

from SPARQLWrapper import SPARQLWrapper, RDFXML
sparql = SPARQLWrapper("https://sparql.uniprot.org/sparql")
sparql.setQuery("""
PREFIX taxon: <http://purl.uniprot.org/taxonomy/>
PREFIX up: <http://purl.uniprot.org/core/>
CONSTRUCT
{
    ?protein a up:HumanProtein .
}
WHERE
{
    ?protein a up:Protein .
    ?protein up:organism taxon:9606 .
}
""")
sparql.setReturnFormat(RDFXML)
results = sparql.queryAndConvert()
# 按需处理结果,例如序列化输出
print(results.serialize())

如果需要用Turtle格式接收结果,调整返回格式配置即可:

from SPARQLWrapper import SPARQLWrapper, TURTLE
# 端点、查询语句配置不变
sparql.setReturnFormat(TURTLE)
results = sparql.queryAndConvert()

调整后执行queryAndConvert()即可正常获取CONSTRUCT查询返回的RDF图结果,不会再触发解析报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:21:33