14

我对python很陌生。我正在尝试解析 URL 文件以仅保留域名。

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

这是我的代码中去掉 http:// 部分的部分。我需要添加什么来查找 http 和 www。并删除两者?

line = re.findall(r'(https?://\S+)', line)

目前,当我运行代码时,只有 http:// 被剥离。如果我将代码更改为以下内容:

line = re.findall(r'(https?://www.\S+)', line)

只有以两者开头的域会受到影响。我需要代码更有条件。TIA

编辑...这是我的完整代码...

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。

4

6 回答 6

20

对于这种特定情况,这可能有点矫枉过正,但我​​通常会使用urlparse.urlsplit(Python 2)或urllib.parse.urlsplit(Python 3)。

from urllib.parse import urlsplit  # Python 3
from urlparse import urlsplit  # Python 2
import re

url = 'www.python.org'

# URLs must have a scheme
# www.python.org is an invalid URL
# http://www.python.org is valid

if not re.match(r'http(s?)\:', url):
    url = 'http://' + url

# url is now 'http://www.python.org'

parsed = urlsplit(url)

# parsed.scheme is 'http'
# parsed.netloc is 'www.python.org'
# parsed.path is None, since (strictly speaking) the path was not defined

host = parsed.netloc  # www.python.org

# Removing www.
# This is a bad idea, because www.python.org could 
# resolve to something different than python.org

if host.startswith('www.'):
    host = host[4:]
于 2013-01-31T12:31:11.183 回答
10

您可以在此处不使用正则表达式。

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.replace("www.", "")用替换该行lines = re.sub(r'(www.)(?!com)',r'',lines)。当然,每个可能的 TLD 都应该用于不匹配模式。

于 2013-01-31T12:25:15.327 回答
6

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

>>> 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'
于 2016-04-20T20:16:12.813 回答
4

查看urlparse 库,它可以自动为您完成这些事情。

>>> urlparse.urlsplit('http://www.google.com.au/q?test')
SplitResult(scheme='http', netloc='www.google.com.au', path='/q', query='test', fragment='')
于 2013-01-31T12:27:59.397 回答
1

您可以使用urlparse。此外,解决方案应该是通用的,以删除域名前的“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 
于 2013-07-03T17:54:53.980 回答
0

我相信@Muneeb Ali 是最接近解决方案的,但问题出现在诸如 frontdomain.domain.co.uk....

我想:

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

有没有更好的方法来做到这一点?

于 2019-02-14T09:57:12.050 回答