2017-06-20 6 views
-1

テキスト文字列内のすべてのURLを抽出するクリーンな方法を見つけようとしています。python3で文字列内のすべてのURLを抽出します

広範な検索の結果、正規表現を使用してタスクを実行することを提案している正規表現が多数見つかりました。各レグゼクティブにはいくつかの長所と短所があります。また、それらを編集して行動を変えることは簡単ではありません。

入力:

Loremのイプサムの嘆きはAMET https://www.lorem.com/ipsum.php?q=suas座って、nusquam tincidunt元あたり、IUSモデュスインテグレなし、quandoとにかくこの時点で私が正しく、このテキスト中のURLを検出できる任意の正規表現で満足していますユーロケーキ結論を出すためには、エリートペルティナシアno eos、nonumy comprehensam id mei。 Ei eum maiestatis quaerendum https://www.lorem.org。賛助会員は、http://news.bbc.co.ukオムニェアワードの定義に従ってください。 Cuデュオ・エクイドメイヤー・クオリティスク。

出力:

[ 'https://www.lorem.com/ipsum.php?q=suas'、 'https://www.lorem.org'、 'http://news.bbc.co.uk']

しかし

内のすべてのURLを見つけたのpython3クラス/関数/ライブラリは、存在する場合指定されたテキストとパラメータを受け取る:

  1. 検出するプロトコルを選択します。
  2. は、ドメインが

を許可されている、私はそれについて知っていることは非常に幸せになる選択する許可されているのTLDを選択します。

+1

質問タイトルを書いているうちにあなたが眠ってしまったと思います。 –

+0

多分。だから、私は質問のタイトルを編集しました... – Ouss

答えて

2

他の人の言わばのこととは別に、既に存在するものを尋ねたので、URLExtractを試してみるとよいでしょう。

明らかに、それは与えられたテキストでTLDの出現を見つけようとします。 TLDが見つかった場合は、その位置から開始し、境界を「ストップ文字」(通常は空白、カンマ、一重引用符または二重引用符)を検索して両側に拡張します。

あなたはいくつかの例がありますhere

from urlextract import URLExtract 

extractor = URLExtract() 
urls = extractor.find_urls("Let's have URL youfellasleepwhilewritingyourtitle.com as an example.") 
print(urls) # prints: ['youfellasleepwhilewritingyourtitle.cz'] 

あなたが手動でいくつかのチェックを行うことができ、このモジュールはまた、それはあなたの特定の要件に適合しない場合は、

しかしTLDリストキャッシュファイルを更新することができますupdate()方法を持っているようですあなたが上記のモジュール(または他の方法でURLを解析する方法)を使用してURLを処理した後。

allowed_protocols = ['protocol_1', 'protocol_2'] 
allowed_tlds = ['tld_1', 'tld_2', 'tld_3'] 
allowed_domains = ['domain_1'] 

for each_url in results: 
    # here, check each url against your rules 
今すぐ
0
output = [x for x in input().split() if x.startswith('http://') or x.startswith('https://') or x.startswith('ftp://')] 
print(output) 

あなたの例:それは文字でない場合は、リストの要素の最後の文字をカットすることができ、すべての後 http://ideone.com/wys57x

EDIT:

output = [x for x in input().split() if x.startswith('http://') or x.startswith('https://') or x.startswith('ftp://')] 
newOutput = [] 
for link in output: 
    copy = link 
    while not copy[-1].isalpha(): 
     copy = copy[:-1] 
    newOutput.append(copy) 
print(newOutput) 

あなたの例では:あなたが正規表現をしたい場合http://ideone.com/gHRQ8w

+0

返事をありがとう。あなたの方法は、 "https://www.lorem.org" – Ouss

+0

で笑顔を除外しません。手紙でないならば、リストの要素の最後の文字をカットするだけです。 –

+0

@Oussは私の答えを今すぐチェックします。 –

2

、あなたはこれを使用することができます。

import re 


string = "Lorem ipsum dolor sit amet https://www.lorem.com/ipsum.php?q=suas, nusquam tincidunt ex per, ius modus integre no, quando utroque placerat qui no. Mea conclusionemque vituperatoribus et, omnes malorum est id, pri omnes atomorum expetenda ex. Elit pertinacia no eos, nonumy comprehensam id mei. Ei eum maiestatis quaerendum https://www.lorem.org. Pri posse constituam in, sit http://news.bbc.co.uk omnium assentior definitionem ei. Cu duo equidem meliore qualisque." 

result = re.findall(r"\w+://\w+\.\w+\.\w+/?[\w\.\?=#]*", string) 
print(result) 

出力:

['https://www.lorem.com/ipsum.php?q=suas', 
'https://www.lorem.org', 
'http://news.bbc.co.uk'] 
+1

あなたの結果は '['https://www.lorem.com/'、 'https:// www .lorem.org。 '、' http://news.bbc.co。 ']' – Gahan

+0

ああ、申し訳ありませんが、コードをコピーして貼り付けるときにタイプミスがありました。 – abccd

0
import re 
import string 
text = """ 
Lorem ipsum dolor sit amet https://www.lore-m.com/ipsum.php?q=suas, 
nusquam tincidunt ex per, ftp://link.com ius modus integre no, quando utroque placerat qui no. 
Mea conclusionemque vituperatoribus et, omnes malorum est id, pri omnes atomorum expetenda ex. 
Elit ftp://link.work.in pertinacia no eos, nonumy comprehensam id mei. Ei eum maiestatis quaerendum https://www.lorem.org. 
Pri posse constituam in, sit http://news.bbc.co.uk omnium assentior definitionem ei. Cu duo equidem meliore 
qualisque. 
""" 

URL_REGEX = r"""((?:(?:https|ftp|http)?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:com|org|uk)/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<[email protected])[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?:com|uk|ac)\b/?([email protected])))""" 

urls = re.findall(URL_REGEX, text) 
print([''.join(x for x in url if x in string.printable) for url in urls]) 

あなたがしたい場合:

result = ['https://www.lorem.com/ipsum.php?q=suas', 'https://www.lorem.org', 'http://news.bbc.co.uk'] 

あなたはその後、除外ドメイン/ TLDのの/ etcを保持する別のリストを構築することができます。たとえば、と言うあなたは、URLのリストを取得します有効なドメインのURLだけを書いてください。

VALID_DOMAINS = ['lorem.org', 'bbc.co.uk', 'sample.com', 'link.net'] 
valid_urls = [] 
for url in result_url: 
    for val_domain in VALID_DOMAINS: 
     if val_domain in url: 
      valid_urls.append(url) 
print(valid_urls) 
0

既存のライブラリを使用するのがおそらく最適です。

しかし、それは私の小さなスクリプトのあまりだった、と - 私が思いついたの@ピョートル・wasilewiczs answer--に触発さ:

  • 、ラインの各単語のために

    from string import ascii_letters 
    links = [x for x in line.split() if x.strip(str(set(x) - set(ascii_letters))).startswith(('http', 'https', 'www'))] 
    
    • 単語そのものに含まれる非ASCII文字を(最初と最後から)削除してください。
    • そして、https、http、wwwのいずれかで始まる単語でフィルタリングしてください。

    私の味のために濃すぎると私はどのくらい速いかわかりませんが、それは文字列の中でほとんどの "正常な" URLを検出する必要があります。

  • 関連する問題