2013-05-10 213 views
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)混亂的enconding(一個工程師的,因此這個想法從網站證實這是他們三店的錯誤)。例如:而不是é,您應該看到é

我想要一個文件,我至少可以使用python 2.7 str.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> 
+1

我沒有看到。那些應該存在的嚴重編碼問題是什麼?我看到的只是一個URL編碼的查詢字符串。你能詳細說明嗎? – 2013-05-10 18:34:58

+0

我看到非英文單詞。不知道該文件應該用什麼語言來是... – CppLearner 2013-05-10 18:35:54

+0

@MartijnPieters我並不想清理URL,但隨後出現的頁面。 – hyogapag 2013-05-10 18:53:55

回答

4

與頁面的問題似乎是服務器編碼的文本爲UTF-8,然後當作UTF-8的Latin-1並以UTF-8 再次編碼爲。爲了逆轉這種情況,請以UTF-8格式讀取文件,將其編碼爲Latin-1字節的字符串,然後將字節解碼爲UTF-8。

+0

你的解釋很清楚,而且看起來很合理。非常感謝你。 – hyogapag 2013-05-10 19:33:47

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é. 
+0

你的線路非常有幫助。不幸的是,我不能將你的答案標記爲有用,因爲我沒有足夠的信用。非常感謝你。 – hyogapag 2013-05-10 19:35:49