使用SPARQLWrapper从DBpedia取数遇RuntimeWarning,无法解析JSON结果
使用SPARQLWrapper从DBpedia获取JSON数据失败
我尝试用SPARQLWrapper以JSON格式从DBpedia数据库中获取数据,代码如下:
from SPARQLWrapper import SPARQLWrapper, JSON sparql = SPARQLWrapper("http://dbpedia.org") sparql.setReturnFormat(JSON) sparql.setQuery(""" PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?birth_date ?birth_place WHERE { ?name rdfs:label "Ed Sheeran"@en . ?name dbo:birthDate ?birth_date . ?name dbo:birthPlace ?birth_place . }""") try: ret = sparql.queryAndConvert() ret = ret.decode('utf-8') # print(ret) # for r in ret["results"]["bindings"]: # print(r) except Exception as e: print(e)
执行后出现以下警告,且无法得到预期结果:
RuntimeWarning: unknown response content type 'text/html; charset=UTF-8' returning raw response...
warnings.warn(
该查询在DBpedia官方SPARQL查询页面可正常返回Ed Sheeran的出生日期和出生地的JSON结果,请问哪里操作出错了?
问题分析与解决
错误原因
- SPARQL端点地址错误:你使用的
http://dbpedia.org是DBpedia的首页地址,而非SPARQL查询端点。正确的端点应该是http://dbpedia.org/sparql,直接访问根地址会返回HTML页面,这就是警告中出现text/html内容类型的原因。 - 多余的解码操作:当设置返回格式为JSON时,
queryAndConvert()方法会自动将响应解析为Python字典,不需要再调用decode('utf-8'),这一步会破坏字典结构,导致无法正常访问结果数据。
修正后的代码
from SPARQLWrapper import SPARQLWrapper, JSON # 修正SPARQL端点地址 sparql = SPARQLWrapper("http://dbpedia.org/sparql") sparql.setReturnFormat(JSON) sparql.setQuery(""" PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX dbo: <http://dbpedia.org/ontology/> SELECT ?birth_date ?birth_place WHERE { ?name rdfs:label "Ed Sheeran"@en . ?name dbo:birthDate ?birth_date . ?name dbo:birthPlace ?birth_place . }""") try: ret = sparql.queryAndConvert() # 直接遍历解析后的字典结构 for r in ret["results"]["bindings"]: print(f"出生日期: {r['birth_date']['value']}") print(f"出生地: {r['birth_place']['value']}") except Exception as e: print(e)
补充说明
- 代码中显式添加了
dbo前缀的定义,虽然原查询可能隐式识别,但显式声明前缀是更规范的SPARQL写法。 - 修正后的代码会直接输出结构化的查询结果,无需手动处理JSON字符串。
内容的提问来源于stack exchange,提问作者Abhimanyu Anand
相关产品推荐
相关产品推荐

