Python 替换多种不同语言的特殊字符

Python replace special character of many different languages

我正在从一个网站上读取表格,其中一列是大学名称,其中一些名称具有特殊字符,如下所示(但是名称的写法就像我把它们放在这里一样,所以这不是一项任务我可以通过以不同的方式阅读网络来修复):

['Koç University', 'Technische Universität Dresden', 'Universität für Musik und darstellende Kunst Wien', 'Technische Universität Wien', 'Ã\x89cole Nationale Supérieure des Beaux-Arts, Paris', 'Universidad Simón BolÃ\xadvar (USB)', 'PontifÃ\xadcia Universidade Católica do Rio Grande do Sul (PUCRS)', 'Bogaziçi Ã\x9cniversitesi', 'UniversitÃ\xa0 degli Studi di Udine', 'Universitat Autònoma de Barcelona', 'Université de Rennes 1', 'Ã\x89cole Normale Supérieure de Lyon', 'Ã\x89cole Nationale Supérieure de Création Industrielle, ENSCI Les Ateliers', 'Universität Bremen', 'Institut National des Sciences Appliquées de Lyon (INSA)', 'Université Laval', 'Universität des Saarlandes', 'Universität Konstanz', 'Philipps-Universität Marburg ', 'El Colegio de México, A.C.', 'Humboldt-Universität zu Berlin', 'PontifÃ\xadcia Universidade Católica do Rio de Janeiro', 'Universidade Federal do Paraná - UFPR', 'Universität Potsdam', 'USI - Università  della Svizzera italiana', 'Palacký University Olomouc', 'CentraleSupélec', 'Arts et Métiers, ParisTech', 'Université de Sherbrooke', 'UniversitÃ\xa0 degli studi Roma Tre', 'Westfälische Wilhelms-Universität Münster ', 'Universidad Politécnica de Madrid (UPM)', 'Universidad Adolfo IbÃ\xa0ñez ', 'Ã\x89cole Centrale de Lille', 'Université Paris 13 Nord', 'Università  degli Studi di Udine', 'Universidade Federal de São Paulo', 'Instituto Nacional de Matemática Pura e Aplicada (IMPA)', 'Universität Mannheim', 'Université Toulouse 1 Capitole', 'Technische Universität Braunschweig', 'Eberhard Karls Universität Tübingen', 'Universität Rostock', 'Université Grenoble Alpes', 'Université de Fribourg', 'Universität Innsbruck', 'Universidad Adolfo Ibà ñez ', 'Université du Québec', 'Universidad de la República (Udelar)', 'Universitat Politècnica de Catalunya · BarcelonaTech (UPC)', 'Universität Regensburg', 'Université de Paris', 'Université Paris 1 Panthéon-Sorbonne ', 'Universidad Técnica Federico Santa MarÃ\xada (USM)', 'Ruprecht-Karls-Universität Heidelberg', 'Pontificia Universidad Católica Argentina', 'UniversitÃ\xa0Â\xa0di Padova', 'Technische Universität Berlin (TU Berlin)', 'Universität Stuttgart', 'Fundação Getulio Vargas (FGV)', 'Universidade de São Paulo', 'Universidad Nacional Autónoma de México  (UNAM)', 'Universidade Federal de São Carlos (UFSCar)', 'Ã\x89cole Centrale de Nantes', 'Technische Universität Kaiserslautern', 'Università  degli studi Roma Tre', 'Pontificia Universidad Católica del Perú', 'UniversitÃ\xa0 degli Studi di Pavia', 'Université PSL', 'Université de Montréal ', 'Pontificia Universidad Católica de ValparaÃ\xadso', 'University Paris 2 Panthéon-Assas', 'Université Paris-Nanterre', 'Universidad Autónoma de San Luis de PotosÃ\xad', 'Universität  Leipzig', 'Ruhr-Universität Bochum', 'Université Lumière Lyon 2', 'Université de Lille', 'Université Claude Bernard Lyon 1', 'Université catholique de Louvain (UCLouvain)', 'Université  de Technologie, Troyes (UTT)', 'Universidad de San Andrés - UdeSA', 'Martin-Luther-Universität Halle-Wittenberg', 'University of Tromsø The Arctic University of Norway', 'Rheinische Friedrich-Wilhelms-Universität Bonn', 'Universidad de Alcalá', 'USI - UniversitÃ\xa0 della Svizzera italiana', 'Linköping University', 'Universidad Nacional de Córdoba - UNC', 'UniversitÃ\xa0 degli Studi di Perugia', 'Università  degli Studi di Pavia', 'Johannes Gutenberg Universität Mainz', 'Università  Iuav di Venezia', 'Friedrich-Alexander-Universität Erlangen-Nürnberg', 'Université de Nantes', 'Universidad de Córdoba', 'Universidade de BrasÃ\xadlia', 'Université de Strasbourg', 'Universidad Autónoma de Nuevo León', 'Pontificia Universidad Católica de Chile (UC)', 'Université Paris-Est Créteil Val de Marne', 'Universidad Autónoma del Estado de México (UAEMex)', 'Université de Montpellier', 'Universität der Künste Berlin', 'Università  di Padova', 'Université Paris-Saclay', 'Eötvös Loránd University', 'Technische Universität Bergakademie Freiberg', 'Technische Universität Hamburg', 'Universidade Católica Portuguesa - UCP', 'Ã\x89cole Nationale Supérieure des Industries Chimiques (ENSIC), Nancy', 'Instituto Tecnológico Autónomo de México (ITAM)', 'Université de Limoges', 'Université Sorbonne Nouvelle Paris 3', 'Université Paul Sabatier Toulouse III', 'Julius-Maximilians-Universität Würzburg', 'Université de Poitiers', 'Universitat Politècnica de València', 'UniversitÃ\xa0Â\xa0Cattolica del Sacro Cuore', 'Université Nice Sophia Antipolis', 'University of Jyväskylä', "Haute Ecole d\'art et de design de Genève (HEAD)", 'Bauhaus-Universität Weimar', 'Université de Liège', 'Universität Jena', 'University of Göttingen', 'Technische Universität Ilmenau', 'Ã\x89cole Centrale de Lyon', 'Ludwig-Maximilians-Universität München', 'Université de Lorraine', 'Université de Technologie de Compiègne (UTC)', "Université Côte d\'Azur", 'Universität Siegen', 'Universität Duisburg-Essen', 'Université de Savoie, Chambery, Annecy', 'Universidad Autónoma de Madrid', 'Università  Cattolica del Sacro Cuore', 'Ankara Ã\x9cniversitesi', 'Universidade da Coruña ', 'Università  degli Studi di Perugia', 'Hochschule für Gestaltung und Kunst Zürich', 'Universität Hamburg']

我想将这些特殊字符转换成它们的原始形式,我的意思是:Å、ö、ü、ã、á、è、ê 等。 我知道我必须对这个特殊字符进行一些编码和解码,但我不明白。 我尝试了以下代码,但没有修复它们:

special_string.encode('utf-8').decode('utf-8')

有谁知道如何在所有不同的“编码”语言中进行此更改?也许有这个任务的图书馆?

正如 Deceze 评论的那样,如果数据在源头被损坏,则无法保证您可以撤消损坏。但是,使用您提供的数据我们可以取得一些进展。

首先,您列表中的绝大多数字符串都可以通过编码为 latin-1 然后解码为 UTF-8 来修复。

>>> s = 'Technische Universität Dresden'
>>> s.encode('latin').decode('utf-8')
'Technische Universität Dresden'

无法以这种方式解码这些字符串:

USI - Università della Svizzera italiana
Università degli Studi di Udine
Universidad Adolfo Ibà ñez 
Università degli studi Roma Tre
Università degli Studi di Pavia
Università Iuav di Venezia
Università  di Padova
Università  Cattolica del Sacro Cuore
Università degli Studi di Perugia

值得注意的是,除了其中一所大学外,其他所有大学都是意大利大学。 “大学”的意大利语是“università”。让我们尝试通过执行与“修复”相反的操作来破坏它:

>>> s = 'Università'
>>> s.encode('utf-8').decode('latin')
'UniversitÃ\xa0'

你可以看到我们得到了我们在不固定名称中看到的“UniversitÔ加上 '\xa0',这是不间断的 space 字符 - 这个字符可能被网站或你的抓取工具,导致意大利名字特别腐败。解决这些问题的最简单方法可能是在尝试修复它们之前将“Ô替换为“à”。

只剩下 'Universidad Adolfo Ibà ñez',我们认为应该是“Universidad Adolfo Ibáñez”。让我们“腐蚀”它:

>>> "Universidad Adolfo Ibáñez".encode('utf-8').decode('latin-1')
'Universidad Adolfo Ibáñez'

这看起来与列表中的版本相同,只是倒置的感叹号字符已被替换为 space。我们可以恢复它来修复我们的字符串。

>>> s = 'Universidad Adolfo Ibà ñez'
>>> bs = s.encode('latin-1')
>>> fixed = bs.replace(b'\xc3 ', b'\xc3\xa1').decode('utf-8')
>>> fixed
'Universidad Adolfo Ibáñez'