Python: использование регулярного выражения для соответствия одной строке HTML - PullRequest
1 голос
/ 17 марта 2010

Этот простой метод Python, который я собрал, просто проверяет, работает ли Tomcat на одном из наших серверов.

import urllib2
import re
import sys

def tomcat_check():

    tomcat_status = urllib2.urlopen('http://10.1.1.20:7880')
    results = tomcat_status.read()
    pattern = re.compile('<body>Tomcat is running...</body>',re.M|re.DOTALL)
    q = pattern.search(results)
    if q == []:
        notify_us()
    else:
         print ("Tomcat appears to be running")
    sys.exit()

Если эта строка не найдена:

<body>Tomcat is running...</body>

Звонит:

notify_us()

Который использует SMTP для отправки сообщения электронной почты себе и другому администратору, что Tomcat больше не работает на сервере ...

Я раньше не использовал модуль re в Python ... поэтому я предполагаю, что есть лучший способ сделать это ... Я также открыт для более изящного решения с Beautiful Soup ... но не использовал что либо ..

Просто стараюсь сделать это как можно проще ...

Ответы [ 5 ]

8 голосов
/ 17 марта 2010

Зачем вообще здесь использовать регулярные выражения? Почему бы просто не искать строку?

if not '<body>Tomcat is running...</body>' in results:
   notify_us()
2 голосов
/ 17 марта 2010
if not 'Tomcat is running' in results:
    notify_us()
1 голос
/ 17 марта 2010

Есть много разных методов:

str.find ()

if results.find("Tomcat is running...") != -1:
    print "Tomcat appears to be running"
else:
    notify_us()

Использование X в Y

if "Tomcat is running..." in result:
    print "Tomcat appears to be running"
else:
    notify_us()

Использование регулярных выражений

if re.search(r"Tomcat is running\.\.\.", result):
    print "Tomcat appears to be running"
else:
    notify_us()

Лично я предпочитаю, чтобы оператор членства проверял, находится ли строка в другой строке.

0 голосов
/ 17 марта 2010

Как вы упомянули, регулярные выражения не подходят для анализа XML-подобных структур (по крайней мере, для более сложных запросов). Я бы сделал что-то подобное:

from lxml import etree
import urllib2

def tomcat_check(host='127.0.0.1', port=7880):
    response = urllib2.urlopen('http://%s:%d' % (host, port))
    html = etree.HTML(response.read())
    return html.findtext('.//body') == 'Tomcat is running...'

if tomcat_check('10.1.1.20'):
    print 'Tomcat is running...'
else:
    # notify someone
0 голосов
/ 17 марта 2010

Поскольку вы, похоже, ищете фиксированную строку (а не регулярное выражение), над которой у вас есть некоторый контроль, и можно ожидать, что она будет согласованной, str.find () подойдет просто отлично. Или что сказал Даниил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...