【问题标题】:Unable to parse Url with python urlparse无法使用 python urlparse 解析 Url
【发布时间】:2015-01-26 06:26:26
【问题描述】:

我正在尝试编写一个小脚本,它将 url 作为输入并解析它。

以下是我的脚本

#! /usr/bin/env python

import sys

from urlparse import urlsplit
url = sys.argv[1]
parseUrl = urlsplit(url)
print 'scheme  :', parseUrl.scheme
print 'netloc  :', parseUrl.netloc

但是当我用./myscript http://www.example.com执行这个脚本时

它显示以下错误。

AttributeError: 'tuple' object has no attribute 'scheme'

我是python/scripting 的新手,我哪里做错了?

编辑:我使用的 Python 版本是 Python 2.7.5

【问题讨论】:

  • 您没有使用 2.7.5。我刚刚下载并编译了它,你的代码可以很好地使用它,就像我的默认 Python 2.7.6 一样。您可以使用python --version 检查您的版本。确保 /usr/bin/env python 也返回正确的 python。
  • 我已经在python --version 之后执行,它返回给我 Python 2.7.5 然后我在 usr/bin/env python 之后执行,它在 Python 2.7.5 之后返回我(默认,2014 年 3 月 9 日,22:15:05 ) [GCC 4.2.1 兼容 Apple LLVM 5.0 (clang-500.0.68)] 在达尔文上
  • 如果在脚本中添加print sys.version 会发生什么?另外,您是如何运行脚本的 - 在提示符下以交互方式运行?
  • 是的,你是对的,python 版本是Python 2.4.3。我会升级到2.7。谢谢!
  • 听起来您已经在某处安装了正确的 Python。你只需要改变你的#!到那个 Python 的行,例如"#!/usr/bin/python2.7" 或任何正确的路径

标签: python bash urlparse


【解决方案1】:

你不想要计划。相反,在这种情况下,您希望访问元组的 0 索引和元组的 1 索引。

print 'scheme  :', parseUrl[0]
print 'netloc  :', parseUrl[1]

urlparse 使用 .scheme.netloc 表示法,urlsplit instead uses a tuple (refer to the appropriate index number):

这类似于 urlparse(),但不会将参数从 网址。如果更多,通常应该使用它而不是 urlparse() 最近的 URL 语法允许将参数应用于每个部分 需要 URL 的路径部分(参见 RFC 2396)。独立 需要函数来分隔路径段和参数。这 函数返回一个 5 元组:(寻址方案、网络位置、 路径、查询、片段标识符)。

返回值实际上是元组子类的一个实例。这 类具有以下额外的只读便利属性:

Attribute Index   Value                               Value if not present
scheme      0       URL scheme specifier                empty string
netloc      1       Network location part               empty string
path        2       Hierarchical path                   empty string
query       3       Query component                     empty string
fragment    4       Fragment identifier                 empty string
username            User name                           None
password            Password                            None
hostname            Host name (lower case)              None
port                Port number as integer, if present  None

【讨论】:

    【解决方案2】:

    查看文档,听起来您使用的是 Python 2.4,它没有添加属性。另一个回答错过了文档中的关键部分:

    2.2 版中的新功能。

    在 2.5 版中更改:为返回值添加了属性。

    您必须通过索引或解包来访问元组部分:

    scheme, netloc, path, query, fragment = urlsplit(url)
    

    但是,您确实应该升级到 Python 2.7。不再支持 Python 2.4。

    【讨论】:

    • 我已经用我正在使用的 python 版本更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2020-04-18
    • 2023-03-12
    • 2016-02-10
    • 2013-09-30
    • 2015-02-28
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多