Въпросителен знак остава в 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 Ти ми помогна да видя какъв е проблемът, реших проблема с подниза, като зададох параметъра за броене на функцията за подниз на 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