2010-05-23 66 views
18

Bạn bè của tôi,Trích xuất địa chỉ IP từ chuỗi html (python)

Tôi thực sự muốn trích xuất một địa chỉ IP đơn giản từ chuỗi (thực ra là một dòng html) bằng Python. Nhưng hóa ra là 2 giờ trôi qua tôi vẫn không thể đưa ra một giải pháp tốt.

>>> s = "<html><head><title>Current IP Check</title></head><body>Current IP Address: 165.91.15.131</body></html>" 

- '165.91.15.131' là những gì tôi muốn!

Tôi đã thử sử dụng cụm từ thông dụng, nhưng cho đến giờ tôi chỉ có thể nhận được số đầu tiên.

>>> import re 
>>> ip = re.findall(r'([0-9]+)(?:\.[0-9]+){3}', s) 
>>> ip 
['165'] 

Thực tế, tôi không cảm thấy mình nắm bắt được biểu thức reg và mã trên được tìm thấy và sửa đổi từ các nơi khác trên web.

Tìm hiểu ý kiến ​​và ý tưởng của bạn!

+0

có thể trùng lặp của [Cụm từ thông dụng để khớp với tên máy chủ hoặc Địa chỉ IP?] (Http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address) –

Trả lời

39

Xóa nhóm chụp của bạn:

ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', s) 

Kết quả:

['165.91.15.131'] 

Ghi chú:

  • Nếu bạn đang phân tích cú pháp HTML nó có thể là một ý tưởng tốt để nhìn vào BeautifulSoup.
  • Cụm từ thông dụng của bạn khớp với một số địa chỉ IP không hợp lệ như 0.00.999.9999. Điều này không nhất thiết phải là một vấn đề, nhưng bạn nên biết và có thể xử lý tình huống này. Bạn có thể thay đổi + thành {1,3} để khắc phục một phần mà không làm cho cụm từ thông dụng quá phức tạp.
+0

Cảm ơn rất nhiều, Dấu.Đây chính là nó! – GoJian

+1

Bạn có thể sử dụng biểu thức regex để chỉ chấp nhận địa chỉ IP hợp lệ "\\ b (? :(?: 25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9 ] [0-9]?) \\.) {3} (?: 25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9 ]?) \\ b " – o0rebelious0o

+0

Rất đẹp. Đối với những người bạn quan tâm đến tác động của (?: ...), bạn có thể tìm thấy nó tại các tài liệu http://docs.python.org/2/library/re.html: "(?: .. .) Phiên bản không bắt giữ của dấu ngoặc đơn thông thường. Kết hợp bất kỳ cụm từ thông dụng nào bên trong dấu ngoặc đơn, nhưng chuỗi con khớp với nhóm không thể được truy lục sau khi thực hiện khớp hoặc được tham chiếu sau trong mẫu. " – RussellStewart

7

Bạn có thể sử dụng regex sau để nắm bắt địa chỉ chỉ IP hợp lệ

re.findall(r'\b25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\b',s) 

lợi nhuận

['165', '91', '15', '131'] 
+0

Tuyệt. Đây là một ý tưởng tốt. – GoJian

+1

Về mặt kỹ thuật, điều này không khớp với các địa chỉ IP hợp lệ nhưng các octet hợp lệ. Có thể có bất kỳ số nào trong số đó, có thể cần phải được kiểm tra trong một bước riêng biệt. –

3
import re 

ipPattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') 

findIP = re.findall(ipPattern,s) 

findIP contains ['165.91.15.131'] 
0

Đây là cách tôi đã thực hiện nó. Tôi nghĩ rằng nó rất sạch

import re 
import urllib2 

def getIP(): 
    ip_checker_url = "http://checkip.dyndns.org/" 
    address_regexp = re.compile ('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') 
    response = urllib2.urlopen(ip_checker_url).read() 
    result = address_regexp.search(response) 

    if result: 
      return result.group() 
    else: 
      return None 

get_IP() trả về ip vào một chuỗi hoặc Không

Bạn có thể thay thế address_regexp cho biểu thức thông thường khác nếu bạn muốn có một phân tích chính xác hơn hoặc có thể thay đổi nhà cung cấp dịch vụ web.

1

Cách dễ nhất để tìm ra địa chỉ IP từ nhật ký ..

s = "<html><head><title>Current IP Check</title></head><body>Current IP Address: 165.91.15.131</body></html>" 
info = re.findall(r'[\d.-]+', s) 

Trong [42]: info

Out [42]: [ '165.91.15.131']

+0

Bạn có thể giải thích [\ d .-] +, '- sau này không. những gì nó sẽ đại diện –

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