1

私はpythonを使用しており、以下のようにURLの特定の部分を取得しようとしています

from urlparse import urlparse as ue

url = "https://www.google.co.in"
img_url = ue(url).hostname

結果

www.google.co.in

ケース 1 :

実際には、私はいくつかのURL(リストまたは他の場所に保存されている)を持っているので、私が望むのは、URLで上記のように見つけて、後と前domain nameの部分を取得する必要があることです。つまり、文字列は後と前で始まりますこれは、現在のシナリオでのみ発生します。www..co.infirst dotsecond dotgoogle

したがって、指定された URL が url given iswww.gmail.comであると仮定すると、その中でのみフェッチする必要gmailがあるため、指定された URL が何であれ、コードは最初のドットで始まり、2 番目のドットの前にある部分をフェッチする必要があります。

ケース 2:

domain.com, stackoverflow.comまた、一部の URL は、このように URLなしで直接指定される場合があります。wwwその場合は、 と のみをフェッチする必要がstackoverflowあり domainます。

gmail, stackoverflow, google最後に、私の意図は、そのようなURLからメインネームを取得することです.....

通常、1 つの URL を使用list slicingして文字列をフェッチしますが、多数の URL があるため、上記のように必要な部分を動的にフェッチする必要があります

上記の概念を満たす方法を教えてください。

4

3 に答える 3

2

なぜこれができないのですか:

from urlparse import urlparse as ue
urls = ['https://www.google.com', 'http://stackoverflow.com']
parsed = []
for url in urls:
    decoded = ue(url).hostname
    if decoded.startswith('www.'):
        decoded = ".".join(decoded.split('.')[1:])
    parsed.append(decoded.split('.')[0])
#parsed is now your parsed list of hostnames

また、for ループの if ステートメントを変更することもできます。これは、ドメインによっては、削除したい他のもので始まる場合があるためです。

于 2013-02-22T05:31:05.400 に答える
1

定義済みのトップレベル ドメインのセットを使用する場合はどうでしょうか。

import re
from urlparse import urlparse

#Fake top level domains... EG: co.uk, co.in, co.cc
TOPLEVEL = [".co.[a-zA-Z]+", ".fake.[a-zA-Z]+"]

def TLD(rgx, host, max=4): #4 = co.name
        match = re.findall("(%s)" % rgx, host, re.IGNORECASE)
        if match: 
            if len(match[0].split(".")[1])<=max:
                return match[0]
        else:
            return False

parsed = []
urls = ["http://www.mywebsite.xxx.asd.com", "http://www.dd.test.fake.uk/asd"]
for url in urls:
    o = urlparse(url)
    h = o.hostname
    for j in range(len(TOPLEVEL)):
        TL = TLD(TOPLEVEL[j], h)
        if TL: 
            name = h.replace(TL, "").split(".")[-1]
            parsed.append(name)
            break
        elif(j+1==len(TOPLEVEL)): 
            parsed.append(h.split(".")[-2])
            break

print parsed

それは少しハックで、一部の人にとっては不可解かもしれませんが、それはトリックを行い、それ以上何もする必要はありません:)

于 2013-02-22T06:14:43.677 に答える
0

これが私の解決策です。最後に、ドメインはあなたが期待したドメインのリストを保持しています。

import urlparse
urls = [
    'https://www.google.com', 
    'http://stackoverflow.com',
    'http://www.google.co.in',
    'http://domain.com',
    ]
hostnames = [urlparse.urlparse(url).hostname for url in urls]
hostparts = [hostname.split('.') for hostname in hostnames]
domains = [p[0] == 'www' and p[1] or p[0] for p in hostparts]
print domains # ==> ['google', 'stackoverflow', 'google', 'domain']

討論

  1. まず、を使用してURLのリストからホスト名を抽出しますurlparse.urlparse()ホスト名リストは次のようになります。

    ['www.google.com'、'stackoverflow.com、...]

  2. 次の行では、ドットを区切り文字として使用して、各ホストをパーツに分割します。ホストパーツの各アイテムは次のようになります。

    [['www'、'google'、'com']、['stackoverflow'、'com']、...]

  3. 興味深い作品は次の行にあります。この行は、「ドットの前の最初の部分がwwwの場合、ドメインは2番目の部分(p [1])です。それ以外の場合、ドメインは最初の部分(p [0])です。ドメインリストは次のようになります。 :

    ['google'、'stackoverflow'、'google'、'domain']

  4. 私のコードはlogin.gmail.com.hkを処理する方法を知りません。私は寝るのが遅いので、誰か他の人がこの問題を解決できることを願っています。更新: JohnKurkowskiによるtldextractを見てください。これはあなたが望むことをするはずです。

于 2013-02-22T06:05:49.240 に答える