urllib.quote后问号仍保留在url中

时间:2013-12-11 10:07:41

标签: python xml regex url quote

我正在用Python解析xml数据,xml文件包含url并且你知道url不能直接通过正则表达式解析,因为它们的格式不适合,有些字符会阻止像'?'这样的解析, '$','@'。这就是为什么我使用urllib模块中的urllib.quote函数,它工作得很好,除了一个url,我无法解释这一点。

在urllib.quote之前,网址如下所示:

https://randomurl.fr/?oslc_cm.properties=FORM_item

在功能之后,它变成了:

https%3A//randomurl.fr/?oslc_cm.properties=FORM_item

所以“:”已经更正但是“?”并且“=”保持原样,这会阻止解析。我觉得奇怪的是,它是唯一不起作用的网址,对于另外30个也包含“?”的网址。它只是把它变成“%3F”,“=”变成“%3D”。我试图改变它在xml文件中的位置,但它仍然是这个精确的网址没有引用。但是我注意到如果我用FORM_productCmt更改FORM_item,这是另一个url存在的属性,那么它引用它就好了。这对我来说似乎很随机,我无法弄清楚发生了什么。

有人看到这里的故障吗?

修改

我无法逃避角色,因为我正在获取xml文件并对其进行解析。这是我用来引用网址的代码:

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'

对于每个网址,我可以看到该功能除了一个外,总是一样的。我将它与正确引用的其他网址进行了比较,除了“properties = FORM_item”部分之外,它们完全相似,其中另一个是“properties = FORM_productCmt”。这就是为什么我无法得到它无法工作的原因。

1 个答案:

答案 0 :(得分:0)

谢谢,user2357112 你帮我看看问题是什么,我通过将substring函数的count参数设置为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)
相关问题