2014-06-18 4 views
1

У меня проблемы с .replace(). Мой синтаксический анализатор XML не нравится '&', но принимает '& \ amp;'. Я бы хотел использовать .replace('&','&'), но это, похоже, не работает. Я получаю сообщение об ошибке:Как заменить '&' на '&' в python?

lxml.etree.XMLSyntaxError: xmlParseEntityRef: no name, line 51, column 41 

До сих пор я пытался просто прямой вперед file=file.replace('&','&'), но это не работает. Я также пробовал:

xml_file = infile 
file=xml_file.readlines() 
for line in file: 
     for char in line: 
       char.replace('&','&') 
infile=open('a','w') 
file='\n'.join(file) 
infile.write(file) 
infile.close() 
infile=open('a','r') 
xml_file=infile 

Что было бы лучшим способом исправить мою проблему?

ответ

5

str.replace создает и возвращает новую строку. Он не может изменять строки на месте - они неизменны. Попробуйте заменить:

file=xml_file.readlines() 

с

file = [line.replace('&','&') for line in xml_file] 

Это использует list comprehension построить список, эквивалентный .readlines(), но с заменой уже сделал.

2

str.replace() возвращение новый струнный объект с изменением сделано. Он не изменяет данные на месте. Вы игнорируете возвращаемое значение.

Вы хотите, чтобы применить его к каждой строке вместо:

file = [line.replace('&', '&') for line in file] 

Вы можете использовать fileinput() module сделать преобразование, и иметь его обрабатывать замены исходного файла (резервная копия будет):

import fileinput 
import sys 

for line in fileinput.input('filename', inplace=True): 
    sys.stdout.write(line.replace('&', '&')) 
0

Oh ... Вам необходимо декодировать HTML-обозначения для специальных символов. Python имеет модуль для борьбы с ним - HTMLParser, here some docs.

Вот пример:

import HTMLParser 

out_file = ....  
file = xml_file.readlines() 
parsed_lines = [] 
for line in file: 
    parsed_lines.append(htmlparser.unescape(line)) 
0

Немного не по теме, но это может быть хорошо, чтобы использовать некоторые побега?

Я часто использую цитаты URLLIB, который поместит HTML вытекающее и из:

result=urllib.quote("filename&fileextension") 
'filename%26fileextension' 
urllib.unquote(result) 
filename&fileextension 

может помочь в последовательности?

Смежные вопросы