Найдите http://и/или www. и полоса из домена. оставив domain.com
Я новичок в python. Я пытаюсь проанализировать файл URL-адресов, чтобы оставить только имя домена.
некоторые из URL-адресов в моем файле журнала начинаются с http://, а некоторые начинаются с www.Some начинаются с обоих.
Это часть моего кода, который разделяет часть 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.
Ответы
Ответ 1
Здесь вы можете обойтись без регулярных выражений.
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 должны использоваться для шаблона несоответствия.
Ответ 2
Это может быть излишним для этой конкретной ситуации, но я обычно использовал 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:]
Ответ 3
Посмотрите библиотеку urlparse, которая может сделать это автоматически.
>>> urlparse.urlsplit('http://www.google.com.au/q?test')
SplitResult(scheme='http', netloc='www.google.com.au', path='/q', query='test', fragment='')
Ответ 4
Я столкнулся с той же проблемой. Это решение, основанное на регулярных выражениях:
>>> 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'
Ответ 5
Вы можете использовать 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