Я анализирую XML-данные с помощью Python, XML-файл содержит URL-адреса, и, как вы знаете, URL-адрес не может быть проанализирован напрямую через регулярное выражение, потому что их формат не подходит, есть символы, которые блокируют синтаксический анализ, например '?', '$' , '@'. Вот почему я использую функцию urllib.quote из модуля urllib, и она отлично работает, за исключением одного URL, и я просто не могу это объяснить.
Перед urllib.quote URL-адрес выглядит так:
https://randomurl.fr/?oslc_cm.properties=FORM_item
После функции это выглядит так:
https%3A//randomurl.fr/?oslc_cm.properties=FORM_item
Итак, ":" исправлено, но "?" и "=" остаются как есть, что блокирует синтаксический анализ. Что мне кажется странным, так это то, что это единственный URL-адрес, для которого он не работает, а для 30 других он также содержит "?" он просто превращает его в "% 3F", "=" в "% 3D". Я попытался изменить его место в XML-файле, но этот точный URL-адрес все еще не цитируется. Однако я заметил, что если я изменил FORM_item на FORM_productCmt, который является свойством другого существующего URL-адреса, он просто цитирует его. Мне это кажется довольно случайным, и я не могу понять, что происходит.
Кто-нибудь видит здесь глюк?
ИЗМЕНИТЬ
Я не могу избежать символов, потому что беру XML-файл и разбираю его. Вот код, который я использую для цитирования URL-адресов:
def genElementList(self, xmldata):
xmldata_encoded = xmldata
p = re.compile(r'"(http.*?)"')
urls = p.findall(xmldata)
for url in urls:
xmldata_encoded = str.replace(xmldata_encoded, url, urllib.quote(url))
print xmldata_encoded + '\n'
И для каждого URL-адреса я вижу, что функция работала, кроме одного, всегда одинакового. Я сравнил его с другими URL-адресами, которые правильно цитируются, и они полностью похожи, за исключением части «properties = FORM_item», где другой будет «properties = FORM_productCmt». Вот почему я не понимаю, как это не работает.
?
или$
. Просто если вы хотите включить такие символы в регулярное выражение, вам нужно их экранировать. - person user2357112 supports Monica   schedule 11.12.2013print repr(the_troublesome_string)
и покажите нам, что у вас получилось. - person user2357112 supports Monica   schedule 11.12.2013re.escape
, а неurllib.quote
. - person Corley Brigman   schedule 11.12.2013