这段简单的代码让urlparse抓狂,它没有正确获取主机名,但将其设置为None
from urllib.parse import urlparse
parsed = urlparse("google.com/foo?bar=8")
print(parsed.hostname)我是不是遗漏了什么?
发布于 2018-05-24 08:47:52
只是为了给Muadh的回答添加一些进一步的上下文。使用urlparse查看这两个变体的输出:
>>> parsed = urlparse("google.com/foo?bar=8")
>>> parsed
ParseResult(scheme='',
netloc='',
path='google.com/foo',
params='',
query='bar=8',
fragment=''),并且指定了完整路径
>>> parsed = urlparse("http://google.com/foo?bar=8")
>>> parsed
ParseResult(scheme='http',
netloc='google.com',
path='/foo',
params='',
query='bar=8',
fragment='')发布于 2018-05-24 08:50:58
google.com/foo?bar=8是一个相对网址,也就是一个带有“查询”的“路径”。也许您认为google.com是一个主机名,但它不是必须的( python怎么知道呢?)
URL由协议或方案('https:‘、'ftp:’等)、主机('//example.com')、路径、查询、片段组成。
因此urlparse做出了最佳猜测,对协议和主机返回None。
发布于 2019-10-19 05:36:49
根据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)此函数的前一个版本称为urllib.parse.urlparse(address),如果没有找到,则将"tcp“方案放在前面;但如果您传递类似"user: pass @localhost:1234”的内容,则此函数会将用户名解释为方案。
https://stackoverflow.com/questions/50499273
复制相似问题