【发布时间】:2013-12-11 10:07:40
【问题描述】:
我正在使用 Python 解析 xml 数据,xml 文件包含 url,并且您知道 url 不能直接通过正则表达式解析,因为它们的格式不适合,有些字符会阻止解析,例如“?”, '$'、'@'。这就是为什么我使用 urllib 模块中的 urllib.quote 函数,它工作得很好,除了一个 url,我无法解释这一点。
在 urllib.quote 之前,url 如下所示:
https://randomurl.fr/?oslc_cm.properties=FORM_item
函数之后就变成这样了:
https%3A//randomurl.fr/?oslc_cm.properties=FORM_item
所以“:”被更正了,但“?”并且“=”保持原样,这会阻止解析。我觉得奇怪的是,对于其他 30 个也包含“?”的网址,它是唯一不起作用的网址。它只是把它变成“%3F”,“=”变成“%3D”。我试图改变它在 xml 文件中的位置,但它仍然是这个精确的 url,没有很好地引用。但是我注意到,如果我将 FORM_item 更改为 FORM_productCmt ,这是另一个现有 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'
对于每个 url,我可以看到除了一个之外,该功能都有效,始终相同。我将它与其他正确引用的 url 进行了比较,它们完全相似,除了“properties=FORM_item”部分,另一个是“properties=FORM_productCmt”。这就是为什么我无法理解它是如何工作的。
【问题讨论】:
-
“你知道 url 不能直接通过正则表达式解析” - 我很确定这不是真的。正则表达式非常适合解析
?或$等字符。只是如果你想在一个正则表达式中包含这样的字符,你需要对它们进行转义。 -
该功能在我尝试时可以正常工作。您确定该字符串包含您认为的内容吗?运行
print repr(the_troublesome_string)并告诉我们你得到了什么。 -
引用此输入 URL 也没有问题。我猜这是猎鬼。投反对票。
-
您可能想使用
re.escape,而不是urllib.quote。 -
“我无法转义字符,因为我正在获取一个 xml 文件并对其进行解析” - 除非您从 xml 文件中读取您的正则表达式(为什么要这样做?) ,这不是问题。
标签: python xml regex url quote