Подтвердить что ты не робот

Как извлечь IP-адрес из строки HTML?

Я хочу извлечь IP-адрес из строки (на самом деле однострочный HTML), используя Python.

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

- "165.91.15.131" - это то, что я хочу!

Я пытался использовать регулярные выражения, но пока я могу получить только первый номер.

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

Но у меня нет твердого понимания рег-выражения; приведенный выше код был найден и изменен в другом месте в Интернете.

4b9b3361

Ответ 1

Удалите группу захвата:

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

Результат:

['165.91.15.131']

Примечания:

  • Если вы разбираете HTML, возможно, стоит взглянуть на BeautifulSoup.
  • Ваше регулярное выражение соответствует некоторым недопустимым IP-адресам, таким как 0.00.999.9999. Это не обязательно проблема, но вы должны знать об этом и, возможно, справиться с этой ситуацией. Вы можете изменить + на {1,3} для частичного исправления без чрезмерного сложения регулярного выражения.

Ответ 2

Вы можете использовать следующее регулярное выражение для захвата только допустимых IP-адресов

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)

возвращает

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

Ответ 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']

Ответ 4

Самый простой способ найти ip-адрес из журнала.

 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)

В [42]: info

Вывод [42]: ['165.91.15.131']

Ответ 5

Вы можете использовать следующее регулярное выражение для извлечения действительного IP без следующих ошибок
1.Некоторые обнаружили 123.456.789.111 как действительный IP
2. Некоторые не обнаруживают 127.0.00.1 как действительный IP
3. Некоторые не обнаруживают IP-адреса, начинающиеся с нуля, например 08.8.8.8

Поэтому здесь я публикую регулярное выражение, которое работает на всех вышеперечисленных условиях.

Примечание: я извлек более 2 миллионов IP без каких-либо проблем со следующим регулярным выражением.

(?:(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)\.){3}(?:1\d\d|2[0-5][0-5]|2[0-4]\d|0?[1-9]\d|0?0?\d)

Ответ 6

Вот как я это сделал. Я думаю, что это так чисто.

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() возвращает ip в строку или None

Вы можете заменить address_regexp для других регулярных выражений, если вы предпочитаете более точный синтаксический анализ или, возможно, изменить поставщика веб-услуг.

Ответ 7

import re

ip = r'\d{1,3}(?:[.]\d+){1,3}'

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

ips = re.findall( ip, s)

print(ips)

Results = ['165.91.15.131']

Интересные комментарии, вы, ребята, очень хороши, вы помогли мне взглянуть на вещи по-другому, спасибо. Я знаю, что это старая цепочка, но эффективная.