2013-01-31 9 views
11

Jestem całkiem nowy dla Pythona. Próbuję przeanalizować plik adresów URL, aby pozostawić tylko nazwę domeny.Znajdź http: // i lub www. i usuń z domeny. pozostawiając domenę.com

niektóre adresy URL w moim pliku dziennika zaczynają się od http: //, a niektóre zaczynają się od www.Some zaczynają się od obu.

Jest to część mojego kodu, który usuwa część http: //. Co muszę dodać, aby szukać zarówno http, jak i www. i usunąć oba?

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

Obecnie, gdy uruchamiam kod, tylko http: // jest usuwany. jeśli zmienię kod na:

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

Dotyczy to tylko domen zaczynających się od obu. Potrzebuję kodu, aby był bardziej warunkowy. TIA

edit ... tu jest moje pełny kod ...

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() 

I mistagged przez pierwotnego stanowiska regex. rzeczywiście używa on urlparse.

+3

Tylko uwaga: Zdajesz sobie sprawę, że 'www.domain.com' jest inna * od *' domain.com', prawej i może wskazywać na szalenie różne adresy IP ? –

+0

Co z domenami 'www.www.com' i' www.com'? – Matthias

+0

Duplikat: http://stackoverflow.com/questions/1521592/get-root-domain-of-link –

Odpowiedz

5

Możesz to zrobić bez wyrażeń regularnych tutaj.

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) 

Przykład input file:

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

wyjściowa:

foo.com 
foobar.com 
bar.com 
foobar.com 

Edit:

Nie może być trudne url jak foobarwww.com, a powyższe podejście usunie www. Będziemy musieli następnie powrócić do używania wyrażeń regularnych.

Zamień linię lines = lines.replace("www.", "") na lines = re.sub(r'(www.)(?!com)',r'',lines). Oczywiście, każda możliwa TLD powinna być użyta dla wzoru niezgodnego.

+2

Co się stanie, jeśli URL jest "http://abc.com"? – DSM

+0

@ DSM Nie martw się, nie jest używany;) –

+0

Dzięki, To działa :) Każdy pomysł, jak mogę usunąć wszystko po .co.uk/.com etc? –

4

Zapoznaj się z urlparse library, który może automatycznie wykonać te czynności.

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

To może być przesadą dla tej konkretnej sytuacji, ale chciałbym zazwyczaj używają urlparse.urlsplit (Python 2) lub 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:] 
+0

Nie działa od razu w przypadku adresów URL rozpoczynających się od "http: //". 'urlparse.urlsplit (" www.foo.com "). netloc' zwróci' '' '. – sidi

+0

Tak, ponieważ '' www.foo.com'' nie jest prawidłowym adresem URL. –

+0

Problem polega na tym, że niektóre adresy URL w pliku OP mają ten format. – sidi

0

Można użyć urlparse. Ponadto rozwiązanie powinno mieć charakter ogólny, aby usuwać elementy inne niż "www" przed nazwą domeny (np. Obsługiwać takie przypadki, jak serwer1.domena.com). Oto krótka próba, która powinna zadziałać:

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 
2

Natrafiłem na ten sam problem. Jest to rozwiązanie oparte na wyrażeniach regularnych:

>>> 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' 
Powiązane problemy