Python 查找http://和/或www.并从域中删除。离开domain.com

Python 查找http://和/或www.并从域中删除。离开domain.com,python,url,urlparse,Python,Url,Urlparse,我对python还是个新手。我试图解析一个URL文件,只留下域名 我的日志文件中的一些URL以http://开头,一些以www开头。一些URL以两者开头 这是我的代码中剥离http://部分的部分。我需要添加什么才能同时查找http和www,并同时删除它们 line = re.findall(r'(https?://\S+)', line) 当前,当我运行代码时,只有http://被剥离。如果我将代码更改为以下内容: line = re.findall(r'(https?://www.\S+)

我对python还是个新手。我试图解析一个URL文件,只留下域名

我的日志文件中的一些URL以http://开头,一些以www开头。一些URL以两者开头

这是我的代码中剥离http://部分的部分。我需要添加什么才能同时查找http和www,并同时删除它们

line = re.findall(r'(https?://\S+)', line)
当前,当我运行代码时,只有http://被剥离。如果我将代码更改为以下内容:

line = re.findall(r'(https?://www.\S+)', line)
仅以两者开头的域受影响。 我需要代码更有条件性。 短暂性脑缺血发作

编辑。。。这是我的全部代码

import re
import sys
from urlparse import urlparse

f = open(sys.argv[1], "r")

for line in f.readlines():
 line = re.findall(r'(https?://\S+)', line)
 if line:
  parsed=urlparse(line[0])
  print parsed.hostname
f.close()

我被原来的帖子误认为是正则表达式。它确实在使用urlparse。

您可以在这里不使用正则表达式

with open("file_path","r") as f:
    lines = f.read()
    lines = lines.replace("http://","")
    lines = lines.replace("www.", "") # May replace some false positives ('www.com')
    urls = [url.split('/')[0] for url in lines.split()]
    print '\n'.join(urls)
文件输入示例:

http://foo.com/index.html
http://www.foobar.com
www.bar.com/?q=res
www.foobar.com
输出:

foo.com
foobar.com
bar.com
foobar.com
编辑:

可能会有一个棘手的url,比如foobarwww.com,上面的方法会剥离www。然后我们将不得不恢复使用正则表达式

将行
lines=lines.替换为
lines=re.sub(r'(www.(?!com)),r',lines)
。当然,每个可能的TLD都应该用于不匹配模式。

请查看,它可以自动为您执行这些操作

>>> urlparse.urlsplit('http://www.google.com.au/q?test')
SplitResult(scheme='http', netloc='www.google.com.au', path='/q', query='test', fragment='')

对于这种特定的情况,这可能有些过分,但我通常会使用(Python2)或(Python3)

你可以用。此外,解决方案应该是通用的,以删除除域名前的“www”以外的内容(即处理像server1.domain.com这样的情况)。以下是一个快速的尝试,应该会奏效:

from urlparse import urlparse

url = 'http://www.muneeb.org/files/alan_turing_thesis.jpg'

o = urlparse(url)

domain = o.hostname

temp = domain.rsplit('.')

if(len(temp) == 3):
    domain = temp[1] + '.' + temp[2]

print domain 

我遇到了同样的问题。这是一个基于正则表达式的解决方案:

>>> import re
>>> rec = re.compile(r"https?://(www\.)?")

>>> rec.sub('', 'https://domain.com/bla/').strip().strip('/')
'domain.com/bla'

>>> rec.sub('', 'https://domain.com/bla/    ').strip().strip('/')
'domain.com/bla'

>>> rec.sub('', 'http://domain.com/bla/    ').strip().strip('/')
'domain.com/bla'

>>> rec.sub('', 'http://www.domain.com/bla/    ').strip().strip('/')
'domain.com/bla'

我相信@Muneeb Ali是最接近解决方案的,但当类似于frontdomain.domain.co.uk时,问题就出现了

我想:

for i in range(1,len(temp)-1):
    domain = temp[i]+"."
domain = domain + "." + temp[-1]

有更好的方法吗?

请注意:您确实意识到
www.domain.com
不同于
domain.com
,对吧,可能会指向完全不同的IP?关于域名
www.www.com
www.com
?重复:重复:我会删除我现有的帖子,现在我可以发表评论:)@DSM别担心,它没有被使用;)谢谢,这很有效:)你知道我如何删除.co.uk/.com等之后的所有内容吗?我不明白你所说的所有内容。你能举例说明吗?当然。有些URL是指向页面的链接。因此,在foo.com/index.htm的例子中,我只想留下foo.com,这太棒了,按照我的意愿工作。非常感谢。很抱歉,我觉得python的文档很难理解。你能解释一下你对代码所做的一些修改,让我了解一下它是如何工作的吗?再次感谢。对于以“http://”开头的URL不会立即生效
urlparse.urlspit(“www.foo.com”)。netloc
将返回
'
。是的,这是因为
www.foo.com
不是有效的URL。问题是OP文件中的一些URL是这种格式。尝试以这种方式更改
拆分结果。netloc
将导致引发
属性错误。要更改
netloc
,您需要使用
\u replace
类似的
replace=parsed.\u replace(netloc=host[4:])
我不会更改
netloc
。是吗?
for i in range(1,len(temp)-1):
    domain = temp[i]+"."
domain = domain + "." + temp[-1]