1

我尝试从 dbpedia 检索数据,但每次运行代码时都会出错。

Python中的代码是:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from SPARQLWrapper import SPARQLWrapper, JSON

sparql = SPARQLWrapper("http://dbpedia.org/sparql")
sparql.setQuery("""
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    SELECT ?subject
    WHERE { <http://dbpedia.org/resource/Musée_du_Louvre> dcterms:subject ?subject }
""")

# JSON example
print '\n\n*** JSON Example'
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
for result in results["results"]["bindings"]:
    print result["subject"]["value"]

我相信我必须在“Musée_du_Louvre”中为“é”使用不同的字符,但我不知道是哪个。谢谢!

4

1 回答 1

4

第一个问题是,它SPARQLWrapper似乎期望它的查询是 unicode 格式的,但是你传递给它的是一个 utf-8 编码的字符串——这就是你得到一个UnicodeDecoreError. 相反,您应该通过解码您的 utf-8 字符串来传递一个 unicode 对象

unicode_obj = some_utf8_string.decode('utf-8')

或使用 unicode 文字:

unicode_obj = u'Hello World'

向它传递一个 unicode 对象可以避免这种情况UnicodeDecodeError,但不会产生任何结果。所以看起来dbpedia API 期望包含非 ASCII 字符的 URL 是百分比编码的。因此,您需要事先使用以下代码对 URL 进行编码urllib.quote_plus

from urllib import quote_plus
encoded_url = quote_plus(url, safe='/:')

通过这两项更改,您的代码可能如下所示:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from SPARQLWrapper import SPARQLWrapper, JSON
from urllib import quote_plus

url = 'http://dbpedia.org/resource/Musée_du_Louvre'
encoded_url = quote_plus(url, safe='/:')

sparql = SPARQLWrapper("http://dbpedia.org/sparql")

query = u"""
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    SELECT ?subject
    WHERE { <%s> dcterms:subject ?subject }
""" % encoded_url

sparql.setQuery(query)

# JSON example
print '\n\n*** JSON Example'
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
for result in results["results"]["bindings"]:
    print result["subject"]["value"]
于 2012-09-02T16:50:34.603 回答