2012-03-18 34 views
8

Ví dụ:Làm cách nào để bạn trích xuất url từ chuỗi bằng python?

string = "This is a link http://www.google.com" 

Tôi có thể trích xuất 'http://www.google.com' bằng cách nào?

(Mỗi liên kết sẽ là của cùng một định dạng tức là 'http: //')

+0

Bạn có thể xem câu trả lời này: http://stackoverflow.com/questions/499345/regular-expression-to-extract-url-from-an-html-link – rjz

+0

Không có gì được trả lại khi tôi thử giải pháp đó. – Sheldon

+1

Nếu điều này là cho một tập tin văn bản thô (như được thể hiện trong câu hỏi của bạn), bạn có thể kiểm tra câu trả lời này: http: // stackoverflow.com/questions/839994/extracting-a-url-in-python –

Trả lời

20

Có thể có vài cách để làm điều này nhưng sạch sẽ được sử dụng regex

>>> myString = "This is a link http://www.google.com" 
>>> print re.search("(?P<url>https?://[^\s]+)", myString).group("url") 
http://www.google.com 

Nếu có có thể có nhiều liên kết, bạn có thể sử dụng một cái gì đó tương tự như dưới đây

>>> myString = "These are the links http://www.google.com and http://stackoverflow.com/questions/839994/extracting-a-url-in-python" 
>>> print re.findall(r'(https?://[^\s]+)', myString) 
['http://www.google.com', 'http://stackoverflow.com/questions/839994/extracting-a-url-in-python'] 
>>> 
+5

Đây là quá thô cho nhiều tình huống trong thế giới thực. Nó không hoàn toàn cho 'ftp: //' URL và 'mailto:' URLs, vv, và sẽ vô lý lấy phần đuôi từ 'Click here '(tức là thông qua" bấm "). – tripleee

+0

@tripleee Câu hỏi không phải là phân tích cú pháp HTML, nhưng tìm một URL trong một chuỗi văn bản sẽ luôn là định dạng 'http'. Vì vậy, điều này hoạt động thực sự tốt cho điều đó. Nhưng có, khá quan trọng để mọi người biết bạn đang nói gì nếu họ ở đây để phân tích cú pháp HTML hoặc tương tự. – teewuane

7

để tìm một URL web trong một chuỗi chung chung, bạn có thể sử dụng một regular expression (regex).

Một regex đơn giản để đối sánh URL như sau phù hợp với trường hợp của bạn.

regex = r'(' 

    # Scheme (HTTP, HTTPS, FTP and SFTP): 
    regex += r'(?:(https?|s?ftp):\/\/)?' 

    # www: 
    regex += r'(?:www\.)?' 

    regex += r'(' 

    # Host and domain (including ccSLD): 
    regex += r'(?:(?:[A-Z0-9][A-Z0-9-]{0,61}[A-Z0-9]\.)+)' 

    # TLD: 
    regex += r'([A-Z]{2,6})' 

    # IP Address: 
    regex += r'|(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' 

    regex += r')' 

    # Port: 
    regex += r'(?::(\d{1,5}))?' 

    # Query path: 
    regex += r'(?:(\/\S+)*)' 

    regex += r')' 

Nếu bạn muốn được nhiều hơn chính xác, trong phần TLD, bạn nên đảm bảo rằng các TLD là một TLD hợp lệ (xem toàn bộ danh sách các tên miền cấp cao hợp lệ ở đây: https://data.iana.org/TLD/tlds-alpha-by-domain.txt):

# TLD: 
    regex += r'(com|net|org|eu|...)' 

Sau đó, bạn chỉ có thể biên dịch regex cựu và sử dụng nó để tìm các trận đấu càng tốt:

import re 

    string = "This is a link http://www.google.com" 

    find_urls_in_string = re.compile(regex, re.IGNORECASE) 
    url = find_urls_in_string.search(string) 

    if url is not None and url.group(0) is not None: 
     print("URL parts: " + str(url.groups())) 
     print("URL" + url.group(0).strip()) 

nào, trong trường hợp của chuỗi "Đây là một liên kết http://www.google.com " chí đầu ra:

URL parts: ('http://www.google.com', 'http', 'google.com', 'com', None, None) 
    URL: http://www.google.com 

Nếu bạn thay đổi các đầu vào với một URL phức tạp hơn, ví dụ 'Đây cũng là một địa chỉ URL https://www.host.domain.com:80/path/page.php?query=value&a2=v2#foo nhưng đây không phải là nữa' đầu ra sẽ là:

URL parts: ('https://www.host.domain.com:80/path/page.php?query=value&a2=v2#foo', 'https', 'host.domain.com', 'com', '80', '/path/page.php?query=value&a2=v2#foo') 
    URL: https://www.host.domain.com:80/path/page.php?query=value&a2=v2#foo 

LƯU Ý: Nếu bạn đang tìm kiếm nhiều URL trong một chuỗi duy nhất, bạn vẫn có thể sử dụng regex như nhau, nhưng chỉ cần sử dụng findall() thay vì search().

+1

Vì vậy, regex kết thúc bằng '((?: (Https? | S? Ftp): \/\ /)? (?: www \.)? ((?: (?: [A-Z0-9] [A-Z0-9 -] {0,61} [A-Z0-9] \.) +) ([AZ] {2,6}) | (?: \ D {1,3} \. \ D {1,3} \. \ D {1,3} \. \ D {1,3})) (? :: (\ d {1,5}))? (?: (\/\ S +) *)) '. Cũng lưu ý [danh sách TLD] (https://data.iana.org/TLD/tlds-alpha-by-domain.txt) ngay bây giờ cũng bao gồm các kết thúc thú vị như 'XN - VERMGENSBERATUNG-PWB', dài 24 ký tự , mà sẽ không bị bắt bởi điều này. – luckydonald

+0

Sẽ tốt hơn nếu thêm '(? I)' vào mẫu - dễ di chuyển hơn. Ngoài ra, hãy ghi nhớ điều này sẽ khớp với '23.084.828.566' không phải là địa chỉ IP hợp lệ nhưng là một phao hợp lệ trong một số ngôn ngữ. –

5

Có một cách khác để trích xuất URL từ văn bản một cách dễ dàng. Bạn có thể sử dụng urlextract để làm điều đó cho bạn, chỉ cần cài đặt nó thông qua pip:

pip install urlextract 

và sau đó bạn có thể sử dụng nó như thế này:

from urlextract import URLExtract 

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

Bạn có thể tìm thêm thông tin trên trang github của tôi: https://github.com/lipoja/URLExtract

LƯU Ý: Nó tải xuống danh sách các TLD từ iana.org để giúp bạn cập nhật. Nhưng nếu chương trình không có truy cập internet thì nó không dành cho bạn.

Các vấn đề liên quan