2017-08-31 129 views
1

我试图用python 的urlparse分开url的不同部分,但我似乎在结果中得到了错误的值。Python urlparser给出了错误的结果

baseline = runSql(conn,"Select url from malware_traffic where tag = 'baseline';") 

for i in baseline: 
    print i[0] 
    print urlparse.urlparse(i[0]) 

runSql函数只是返回一个url列表。我依次通过他们,并试图从基线变量到URL中打开的网址,但是Python的方式解析的网址似乎是不正确

172.217.9.174:443/c2dm/register3 
ParseResult(scheme='172.217.9.174', netloc='', path='443/c2dm/register3', params='', query='', fragment='') 
connectivitycheck.gstatic.com:80/generate_204 
ParseResult(scheme='connectivitycheck.gstatic.com', netloc='', path='80/generate_204', params='', query='', fragment='') 
www.google.com:80/gen_204 
ParseResult(scheme='www.google.com', netloc='', path='80/gen_204', params='', query='', fragment='') 
172.217.9.174:443/auth/devicekey 
ParseResult(scheme='172.217.9.174', netloc='', path='443/auth/devicekey', params='', query='', fragment='') 

在你可以清楚地看到,它是计划和netloc混合起来的结果以及将路径包括在内。

例如,第一个结果应该是这样的。

ParseResult(scheme='', netloc='172.217.9.174:443', path='/c2dm/register3', params='', query='', fragment='') 

不知道为什么它会变得混乱。

我实际上使用相同的东西作为这里的文档https://docs.python.org/2/library/urlparse.html的例子之一。

那么我做错了什么或者它是一个错误?

+2

您的网址没有开始'HTTP://',甚至''//,这_specifically_提到的文档。 –

回答

2

问题是您的网址没有方案(http://部分),所以Python认为172.217.9.174:是该方案。与http://一切前缀按预期工作:

>>> urlparse('172.217.9.174:443/c2dm/register3') 
ParseResult(scheme='172.217.9.174', netloc='', path='443/c2dm/register3', params='', query='', fragment='') 
>>> urlparse('http://172.217.9.174:443/c2dm/register3') 
ParseResult(scheme='http', netloc='172.217.9.174:443', path='/c2dm/register3', params='', query='', fragment='') 
+0

对,我知道它为什么这样做,我只是觉得它足够聪明就能认出它。这里的文档建议不需要https://docs.python.org/2/library/urlparse.html – MikeSchem

+0

如果这是唯一的建议,我的解决方法是在内部添加'“//”+ i [0]' URL解析,但我真的不喜欢那样。 – MikeSchem

+0

'mailto:'网址中没有斜杠,所以很难让解析器正确识别这种情况。 – n0rd