【问题标题】:Question mark remains in url after urllib.quoteurllib.quote 之后问号保留在 url 中
【发布时间】: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


【解决方案1】:

谢谢,用户 2357112 你帮我看看是什么问题,我通过将 substring 函数的 count 参数设置为 1 解决了 substring 问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2011-02-02
    • 2022-01-02
    • 2013-11-25
    相关资源
    最近更新 更多