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跳转也能正常返回内容。
修复方案
修改两处配置即可:
- 将端点地址替换为HTTPS协议地址,规避跳转问题
- 显式指定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
相关产品推荐
相关产品推荐

