我想将一个URL分成三个字符串。 示例:
public class Favorite implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "element")
private String element;
@ManyToOne
@JoinColumn(name = "user_fk")
User user;
我希望输出为:
{
"element": "string",
"user": {
"email": "string",
"id": 0,
"life": "suspend",
"name": "string",
"password": "string"
}
}
以上输出基于提供的示例。基本上,我想将字符串分成https://www.google.com:443
http://amazon.com:467
,string 1: https or http
string 2: www.google.com or amazon.com
string 3: 443 or 467
和protocol
并分配给三个不同的变量。
答案 0 :(得分:6)
ULR比人们想象的要复杂,这就是为什么使用经过验证的代码来解析它们并处理意外边缘情况通常是一个好主意的原因。 Python在库中有urllib.parse
,您应该使用它而不是尝试自己解析。
所需的部分位于scheme
返回的对象的hostname
,port
和urlsparse()
属性中
例如:
from urllib.parse import urlparse
def getParts(url_string):
p = urlparse(url_string)
return [p.scheme, p.hostname, p.port]
getParts('https://www.google.com:443')
# ['https', 'www.google.com', 443]
getParts('http://amazon.com:467')
# ['http', 'amazon.com', 467]
# surprising, but valid url:
getParts('https://en.wikipedia.org:443/wiki/Template:Welcome')
# ['https', 'en.wikipedia.org', 443]
# missing parts:
getParts('//www.google.com/example/home')
# ['', 'www.google.com', None]
答案 1 :(得分:1)
您在这里:
url = 'https://www.google.com:443'
first = url.find(':')
last = url.rfind(':')
protocol = url[:first]
domain = url[first+3:last]
port = url[last+1:]
答案 2 :(得分:0)
一种“原始”方法:
from collections import namedtuple
def split_url(url):
split_1 = url.split('://')
split_2 = split_1[1].split(':')
protocol = split_1[0]
domain = split_2[0]
port = split_2[1]
url_split = namedtuple('url_split', ['protocol', 'domain', 'port'])
return url_split(protocol, domain, port)
例如,
s = 'https://www.google.com:443'
result = split_url(s)
那么我们有:
result.protocol
>> 'https'
result.domain
>> 'www.google.com'
result.port
>> '443'