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

編集:

foob​​arwww.comのようなトリッキーなURLが存在する可能性があり、上記のアプローチでは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 に答える