Вопросительный знак остается в url после urllib.quote

Я анализирую 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 Toussah    schedule 11.12.2013    source источник
comment
как вы знаете, URL-адрес не может быть проанализирован напрямую через регулярное выражение - я уверен, что это неправда. Регулярные выражения отлично подходят для синтаксического анализа символов, таких как ? или $. Просто если вы хотите включить такие символы в регулярное выражение, вам нужно их экранировать.   -  person user2357112 supports Monica    schedule 11.12.2013
comment
Когда я пробую, функция работает правильно. Вы уверены, что строка содержит то, что, по вашему мнению, она делает? Запустите print repr(the_troublesome_string) и покажите нам, что у вас получилось.   -  person user2357112 supports Monica    schedule 11.12.2013
comment
У меня также нет проблем с цитированием этого входного URL. Думаю, это охота на привидений. Голосование против.   -  person Alfe    schedule 11.12.2013
comment
вы, вероятно, захотите использовать re.escape, а не urllib.quote.   -  person Corley Brigman    schedule 11.12.2013
comment
Я не могу избежать символов, потому что я получаю XML-файл и разбираю его - если вы не читаете свое регулярное выражение из XML-файла (и зачем вам это делать?), Это не проблема.   -  person user2357112 supports Monica    schedule 12.12.2013
comment
Ваш код замены строк ошибочен. Если один URL-адрес является подстрокой другого, замена первого приведет к искажению второго URL-адреса и приведет к сбою замены второго.   -  person user2357112 supports Monica    schedule 12.12.2013
comment
@ user2357112 Я понимаю вашу точку зрения. Как же тогда это должно выглядеть?   -  person Toussah    schedule 13.12.2013


Ответы (1)


Спасибо, user2357112. Вы помогли мне понять, в чем проблема, я решил проблему с подстрокой, установив для параметра count функции substring значение 1:

p = re.compile(r'"(http.*?)"')
        urls = p.findall(xmldata)
        for url in urls:
            xmldata_encoded = str.replace(xmldata_encoded, url, urllib.quote(url), 1)
person Toussah    schedule 18.12.2013