urlparse失败,并显示简单网址

use*_*465 5 python urlparse python-3.x

这个简单的代码使人urlparse发疯,并且无法正确获取主机名,但将其设置为None

from urllib.parse import urlparse
parsed = urlparse("google.com/foo?bar=8")
print(parsed.hostname)
Run Code Online (Sandbox Code Playgroud)

我想念什么吗?

Huw*_*ers 5

根据https://www.rfc-editor.org/rfc/rfc1738#section-2.1

方案名称由字符序列组成。允许使用小写字母“a”--“z”、数字以及字符加号(“+”)、句点(“.”)和连字符(“-”)。为了弹性,解释 URL 的程序应该将方案名称中的大写字母视为等同于小写字母(例如,允许“HTTP”以及“http”)。

使用之前答案中给出的建议,我编写了这个辅助函数,可以用来代替urllib.parse.urlparse()

#!/usr/bin/env python3
import re
import urllib.parse

def urlparse(address):
    if not re.search(r'^[A-Za-z0-9+.\-]+://', address):
        address = 'tcp://{0}'.format(address)
    return urllib.parse.urlparse(address)

url = urlparse('localhost:1234')
print(url.hostname, url.port)
Run Code Online (Sandbox Code Playgroud)

该函数的早期版本称为urllib.parse.urlparse(address),然后在未找到的情况下在前面添加“tcp”方案;但如果您传递类似“user:pass@localhost:1234”之类的内容,则会将用户名解释为方案。


Mua*_*eim 0

为了使其正常工作,您必须包含协议标识符 (http://)。这对我有用:

parsed = urlparse("https://www.google.com/foo?bar=8")
print(parsed.hostname)
Run Code Online (Sandbox Code Playgroud)

这里的输出是:www.google.com(这似乎是预期的)。可以在此处阅读有关如何使用 urlparse 的更多信息。

希望这可以帮助你!