복붙노트

[PYTHON] 파이썬을 사용하여 문자열에서 URL을 추출하는 가장 깨끗한 방법은 무엇입니까?

PYTHON

파이썬을 사용하여 문자열에서 URL을 추출하는 가장 깨끗한 방법은 무엇입니까?

내가 여기에 게시 된 것과 같은 거대 정규 표현식을 사용할 수 있다는 것을 알았지 만 표준 모듈 또는 일부 타사 추가 기능을 사용하여 지옥 같은 방법으로 약간의 수정이 필요한지 궁금합니다.

간단한 질문이지만 Google (또는 Stackoverflow)에서는 아무 것도 나가지 않았습니다.

너희들이 어떻게 이런 일을하는지 보길 고대해라!

해결법

  1. ==============================

    1.정규식을 사용하십시오.

    정규식을 사용하십시오.

    OP의 의견에 대한 답변 : 도움이되지 않습니다. 정규 표현식을 사용하는 것으로 명시된대로 문제를 해결하는 올바른 방법을 알려 드리고자합니다.

  2. ==============================

    2.여기 장고의 접근법을 보자 : django.utils.urlize (). Regexps는 작업에 너무 제한되어 있으며 대부분 옳은 결과를 얻으려면 경험적 방법을 사용해야합니다.

    여기 장고의 접근법을 보자 : django.utils.urlize (). Regexps는 작업에 너무 제한되어 있으며 대부분 옳은 결과를 얻으려면 경험적 방법을 사용해야합니다.

  3. ==============================

    3.나는 그것이 정확히 당신이 원하지 않는 것을 알고 있지만 여기에는 거대한 정규식을 가진 파일이있다.

    나는 그것이 정확히 당신이 원하지 않는 것을 알고 있지만 여기에는 거대한 정규식을 가진 파일이있다.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """
    the web url matching regex used by markdown
    http://daringfireball.net/2010/07/improved_regex_for_matching_urls
    https://gist.github.com/gruber/8891611
    """
    URL_REGEX = r"""(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)\b/?(?!@)))"""
    

    나는 그 파일 urlmarker.py를 호출하고, 필요할 때 그것을 가져온다. 예를 들어.

    import urlmarker
    import re
    re.findall(urlmarker.URL_REGEX,'some text news.yahoo.com more text')
    

    참조 http://daringfireball.net/2010/07/improved_regex_for_matching_urls

    또한 다음은 Django (1.6)가 URLFields의 유효성 검사에 사용하는 것입니다.

    regex = re.compile(
        r'^(?:http|ftp)s?://'  # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|'  # domain...
        r'localhost|'  # localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|'  # ...or ipv4
        r'\[?[A-F0-9]*:[A-F0-9:]+\]?)'  # ...or ipv6
        r'(?::\d+)?'  # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)
    

    참조 https://github.com/django/django/blob/1.6/django/core/validators.py#L43-50

    Django 1.9는 몇 가지 클래스를 통해 로직이 분할되어 있습니다.

  4. ==============================

    4....이 페이지에서 찾을 수 있습니다 : 완벽한 URL 유효성 검사 정규식을 찾으십시오.

    ...이 페이지에서 찾을 수 있습니다 : 완벽한 URL 유효성 검사 정규식을 찾으십시오.

    모든 테스트를 통과 한 Diego Perini 정규 표현식은 매우 길지만 그의 요지에서 사용할 수 있습니다. 그의 PHP 버전을 파이썬 정규식으로 변환해야한다는 점에 유의하십시오 (약간의 차이점이 있습니다).

    나는 대다수의 테스트를 통과하고 디에고 페리니 (Diego Perini)의 크기의 일부분 인 Imme Emosol 버전을 사용하여 끝냈다.

    다음은 Imme Emosol 정규식의 파이썬 호환 버전입니다.

    r'^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$'
    
  5. ==============================

    5.내가 작성한이 라이브러리를 사용할 수 있습니다.

    내가 작성한이 라이브러리를 사용할 수 있습니다.

    https://github.com/imranghory/urlextractor

    그것은 극히 해킹이지만, 다른 많은 기법과 마찬가지로 "http : //"에 의존하지 않고 (tldextract 라이브러리를 통해) 모질라 TLD 목록을 사용하여 TLD (즉, ".co.uk", ". com "등)를 작성한 다음 TLD 주위에 URL을 구성하려고 시도합니다.

    RFC를 준수하는 것을 목표로하지는 않지만 실세계에서 실제 URL을 사용하는 방법에 대해서는 정확합니다. 따라서 예를 들어 기술적으로 유효한 도메인 "com"(실제 도메인에서는 TLD를 사용할 수 있지만 실제로는 드물지만)을 거부하고 URL에서 쉼표 또는 쉼표를 제거합니다.

  6. ==============================

    6.문자열에 공백 뒤에 오는 URL이 있으면 다음과 같이 할 수 있습니다.

    문자열에 공백 뒤에 오는 URL이 있으면 다음과 같이 할 수 있습니다.

    s는 url을 포함하는 문자열입니다.

    >>> t = s[s.find("http://"):]
    >>> t = t[:t.find(" ")]
    

    그렇지 않으면 find가 -1을 반환하는지 확인해야합니다.

  7. ==============================

    7.BeautifulSoup를 사용할 수 있습니다.

    BeautifulSoup를 사용할 수 있습니다.

    def extractlinks(html):
        soup = BeautifulSoup(html)
        anchors = soup.findAll('a')
        links = []
        for a in anchors:
            links.append(a['href'])
        return links
    

    regexes가있는 솔루션은 더 빠르지 만 정확한 것은 아닙니다.

  8. ==============================

    8.나는 파티에 늦었지만, 여기 freenode의 #python에있는 누군가가 나에게 제안한 해결책이있다. 그것은 정규식 번거 로움을 피할 수 있습니다.

    나는 파티에 늦었지만, 여기 freenode의 #python에있는 누군가가 나에게 제안한 해결책이있다. 그것은 정규식 번거 로움을 피할 수 있습니다.

    from urlparse import urlparse
    
    def extract_urls(text):
        """Return a list of urls from a text string."""
        out = []
        for word in text.split(' '):
            thing = urlparse(word.strip())
            if thing.scheme:
                out.append(word)
        return out
    
  9. ==============================

    9.

    import re
    text = '<p>Please click <a href="http://www.dr-chuck.com">here</a></p>'
    aa=re.findall('href="(.+)"',text)
    print(aa)
    
  10. ==============================

    10.텍스트에서 URL을 쉽게 추출하는 다른 방법이 있습니다. urlextract를 사용하면 pip에 설치할 수 있습니다.

    텍스트에서 URL을 쉽게 추출하는 다른 방법이 있습니다. urlextract를 사용하면 pip에 설치할 수 있습니다.

    pip install urlextract
    

    다음과 같이 사용할 수 있습니다.

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

    내 github 페이지에 대한 자세한 정보는 https://github.com/lipoja/URLExtract에서 확인할 수 있습니다.

    참고 : 최신 정보를 유지하기 위해 iana.org에서 TLD 목록을 다운로드합니다. 그러나 프로그램에 인터넷 접속이없는 경우 귀하를위한 것이 아닙니다.

    이 접근법은 위에서 언급 한 urlextractor에서와 비슷하지만, 최근의 코드는 최근에 유지 보수되었으며 모든 제안 (새로운 기능)을 위해 공개되었습니다.

  11. from https://stackoverflow.com/questions/520031/whats-the-cleanest-way-to-extract-urls-from-a-string-using-python by cc-by-sa and MIT license