Я довольно новичок в питоне. Я пытаюсь разобрать файл 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.

13
Paul Tricklebank 31 Янв 2013 в 16:22

6 ответов

Лучший ответ

Вы можете обойтись без регулярных выражений здесь.

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 должен использоваться для шаблона несоответствия.

8
sidi 31 Янв 2013 в 13:35

Я считаю, что @Muneeb Ali является ближайшим к решению, но проблема возникает, когда что-то вроде frontdomain.domain.co.uk ....

Я полагаю:

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

Есть способ сделать это лучше?

0
Claudiu 14 Фев 2019 в 09:57

Вы можете использовать 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 
1
Muneeb Ali 3 Июл 2013 в 17:54

Это может быть излишним для этой конкретной ситуации, но я бы обычно использовал 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:]
18
Markus Unterwaditzer 8 Фев 2013 в 18:42

Я столкнулся с той же проблемой. Это решение на основе регулярных выражений:

>>> 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
thet 20 Апр 2016 в 20:16

Посетите библиотеку urlparse, которая может выполнить эти действия автоматически.

>>> urlparse.urlsplit('http://www.google.com.au/q?test')
SplitResult(scheme='http', netloc='www.google.com.au', path='/q', query='test', fragment='')
4
Alex L 31 Янв 2013 в 12:30