1

我正在尝试清理通过 SPARQL 查询获得的以下链接的页面内容:

http://www.rechercheisidore.fr/sparql/query?query=PREFIX+dcterms%3A+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Fterms%2F%3E+PREFIX+foaf%3A+%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E+SELECT+%3Furicollection+%3Ftitrecollection+%3Fdescription+%3Fadresseweb+WHERE+{+%3Furicollection+%3Fpredicat+%3Chttp%3A%2F%2Fwww.rechercheisidore.fr%2Fclass%2FCollection%3E.+%3Furicollection+dcterms%3Atitle+%3Ftitrecollection.+%3Furicollection+dcterms%3Adescription+%3Fdescription.+%3Furicollection+foaf%3Ahomepage+%3Fadresseweb.+}+ORDER+BY+ASC%28%3Ftitrecollection%29+LIMIT+300&format=application%2Frdf%2Bxml

该页面是法语的。每个带重音的字母都没有正确显示,当尝试用 Python 中的好字符替换字符时,它会返回错误。我试图将文件转换为 UTF-8,但这并没有解决任何问题(实际上它已经在 utf-8 中)因此产生了混乱的编码想法(网站的一位工程师证实这是他们三重商店中的一个错误)。一个例子:而不是é你应该看到的é

我想有一个文件,我至少可以使用 python 2.7str.replace()函数来取回正确的字符——或者有更好的方法来实现这一点吗?

演示问题的 RDF XML 文件中的示例:

<rdf:RDF xmlns:res="http://www.w3.org/2005/sparql-results#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:nodeID="rset">
<rdf:type rdf:resource="http://www.w3.org/2005/sparql-results#ResultSet" />
    <res:resultVariable>uricollection</res:resultVariable>
    <res:resultVariable>titrecollection</res:resultVariable>
    <res:resultVariable>description</res:resultVariable>
    <res:resultVariable>adresseweb</res:resultVariable>
    <res:solution rdf:nodeID="r0">
      <res:binding rdf:nodeID="r0c0"><res:variable>uricollection</res:variable><res:value rdf:resource="http://www.rechercheisidore.fr/resource/10670/3.ewe76u"/></res:binding>
      <res:binding rdf:nodeID="r0c1"><res:variable>titrecollection</res:variable><res:value>Actualités de l&#39;Ecole des Hautes Etudes en Sciences Sociales</res:value></res:binding>
      <res:binding rdf:nodeID="r0c2"><res:variable>description</res:variable><res:value>L&#39;Ãcole des hautes études en sciences sociales (EHESS), est issue de la transformation, en 1975, de la sixième section de l&#39;Ãcole pratique des hautes études, section de sciences économiques et sociales, fondée en 1947 par Lucien Febvre, Charles Morazé et Fernand Braudel. L&#39;EHESS occupe une place singulière dans le paysage français de la recherche. Elle forme des docteurs dans toutes les disciplines des sciences humaines et sociales, mais elle n&#39;est pas une université.</res:value></res:binding>
      <res:binding rdf:nodeID="r0c3"><res:variable>adresseweb</res:variable><res:value rdf:resource="http://www.ehess.fr"/></res:binding>
    </res:solution>
4

2 回答 2

4

该页面的问题似乎是服务器将文本编码为 UTF-8,然后将 UTF-8 视为 Latin-1 并再次将其编码为 UTF-8 。要反转这一点,请以 UTF-8 格式读取文件,将其编码为 Latin-1 字节字符串,然后将字节解码为 UTF-8。

于 2013-05-10T19:01:45.797 回答
3

jwodder解决方案的佐证:

import lxml.etree as ET
import urllib2

url = "http://www.rechercheisidore.fr/sparql/query?query=PREFIX+dcterms:+<http://purl.org/dc/terms/>+PREFIX+foaf:+<http://xmlns.com/foaf/0.1/>+SELECT+?uricollection+?titrecollection+?description+?adresseweb+WHERE+{+?uricollection+?predicat+<http://www.rechercheisidore.fr/class/Collection>.+?uricollection+dcterms:title+?titrecollection.+?uricollection+dcterms:description+?description.+?uricollection+foaf:homepage+?adresseweb.+}+ORDER+BY+ASC(?titrecollection)+LIMIT+300&format=application/rdf+xml"
doc = ET.parse(urllib2.urlopen(url))

namespaces = { 'ns':'http://www.w3.org/2005/sparql-results#', }

for elt in doc.xpath('//ns:binding[@name="description"]/ns:literal',
                     namespaces=namespaces):
    text = elt.text
    if text is not None:
        text = text.encode('latin-1').decode('utf_8')
        print(text)
    break

产量

L'École des hautes études en sciences sociales (EHESS), est issue de la transformation, en 1975, de la sixième section de l'École pratique des hautes études, section de sciences économiques et sociales, fondée en 1947 par Lucien Febvre, Charles Morazé et Fernand Braudel. L'EHESS occupe une place singulière dans le paysage français de la recherche. Elle forme des docteurs dans toutes les disciplines des sciences humaines et sociales, mais elle n'est pas une université.
于 2013-05-10T19:05:28.723 回答