Python 将编码类型混乱的文件转换为可用的文件

Python 将编码类型混乱的文件转换为可用的文件,python,python-2.7,character-encoding,Python,Python 2.7,Character Encoding,我正在尝试清理以下链接的页面内容,这些链接是通过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+%3Ftitrecollectio

我正在尝试清理以下链接的页面内容,这些链接是通过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中),因此产生了混乱编码的想法(该网站的一名工程师确认这是他们三重存储中的一个bug)。例如:您应该看到
é
,而不是
Ã

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

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


尿收集
回忆
描述
地址网
尿收集
第39条;社会科学高等教育学院
描述';Ãcole des hautesé社会科学研究院(EHESS),最新一期《转型》,1975年,第39卷第19节;《哈佛大学学报》,《科学》第1947卷,《Lucien Febvre》、《查尔斯莫拉兹》、《费尔南德布罗代尔》等。L';她住在法国的一个地方。丹麦博士的形式是人类和社会科学的学科,主要是埃伦和#39;这是一所大学。
地址网

页面的问题似乎是服务器将文本编码为UTF-8,然后将UTF-8处理为拉丁语-1,并再次将其编码为UTF-8。要扭转这种情况,请将文件读入为UTF-8,将其编码为拉丁语-1字节串,然后将字节解码为UTF-8。

页面的问题似乎是服务器将文本编码为UTF-8,然后将UTF-8处理为拉丁语-1,并再次将其编码为UTF-8。要扭转这种情况,请将文件读入为UTF-8,将其编码为拉丁语1字节串,然后将字节解码为UTF-8。

佐证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

佐证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

我不明白。应该存在哪些严重的编码问题?我看到的只是一个URL编码的查询字符串。你能详细解释一下吗?我看到了非英语单词。不确定文件应该使用哪种语言…@MartijnPieters我不想清除URL,但结果页面是法语页面。每个带有重音的字母都不能正确显示,当试图用Python中的好字符替换字符时,它会返回错误。我试图将该文件转换为UTF-8,但这并没有解决任何问题(实际上它已经在UTF-8中),因此产生了混乱编码的想法(该网站的一名工程师确认这是他们三重存储中的一个bug)。例如:您应该看到的不是é而是@@hyogapag:然后在此处包含URL中的数据。URL可能会在某个时候消失,使您的问题对未来的访问者毫无用处。我看不到。应该存在哪些严重的编码问题?我看到的只是一个URL编码的查询字符串。你能详细解释一下吗?我看到了非英语单词。不确定文件应该使用哪种语言…@MartijnPieters我不想清除URL,但结果页面是法语页面。每个带有重音的字母都不能正确显示,当试图用Python中的好字符替换字符时,它会返回错误。我试图将该文件转换为UTF-8,但这并没有解决任何问题(实际上它已经在UTF-8中),因此产生了混乱编码的想法(该网站的一名工程师确认这是他们三重存储中的一个bug)。例如:您应该看到的不是é而是@@hyogapag:然后在此处包含URL中的数据。URL可能在某个时候消失了,这使得你的问题对未来的访问者毫无用处。你的解释非常清楚,之后看起来很合乎逻辑。非常感谢。你的解释很清楚,而且事后看起来很合乎逻辑。非常感谢。你的台词对我很有帮助。不幸的是,我不能认为你的答案有用,因为我没有足够的信用。非常感谢。你的台词对我很有帮助。不幸的是,我不能认为你的答案有用,因为我没有足够的信用。非常感谢你。