2014-09-03 5 views
0

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

Мне нужно знать даты собеседования для кандидата. Они не отправляют нам электронные письма. Here они отправят даты. Я понял, что две интересующие меня должности доктора философии находятся внутри комментариев HTML. Оба они начинаются со строки URBAN.

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

regex = r"<!--(.*?)-->" 

и используется цикл для проверки внутри этих замечаний существование слов ГОРОДСКИХ. Отсутствие строки в комментарии означает, надеюсь, что они отправили даты.

Это мой код:

import requests, re, time, smtplib 

url = "http://dottorato.polito.it/Esami_accesso.html" 

DEBUG = False 

foundInComment = True 

""" 
. matches anything but \n 
* 0 or more occurrences of the pattern to its left 
() groups 
? for non-greedy 
""" 
    regex = r"<!--(.*?)-->" 

while foundInComment: 
    try: 
     r = requests.get(url) 
     html = r.text 

     result = re.findall(regex,html,re.DOTALL) # re.DOTALL makes . match also \n 

     for match in result: 
      if len(re.findall("URBAN",match)) > 1: #One of the commets has to have at least two URBAN 
       foundInComment = True 
       print("\"URBAN AND REGIONAL DEVELOPMEN\" found more than once in a comment at " 
             + time.strftime("%H:%M:%S")) 
       break 
      foundInComment = False 

     time.sleep(600) 

    except KeyboardInterrupt: 
     raise 
    except Exception as e: 
     print e 
     print "Going to sleep for 1 min" 
     time.sleep(60) 

if not DEBUG: 
    fromaddr = '[email protected]' 
    toaddrs = ['[email protected]', fromaddr] 

    msg = 'Subject: PHD polito\n\n Go to %s' % url 

    # Credentials 
    username = 'someone' 
    password = 'password' 

    server = smtplib.SMTP('smtp.gmail.com:587') 
    server.starttls() 
    server.login(username,password) 
    server.sendmail(fromaddr, toaddrs, msg) 
    server.quit() 

    print "End of program" 

Итак, что же вы думаете?

Заранее благодарен!

PS: это часть HTML комментарии, содержащие слова URBAN:

<li><a href="colloqui/Architettura_Storia_Progetto2.pdf">URBAN AND REGIONAL DEVELOPMEN</a></li> 
<li><a href="colloqui/Architettura_Storia_Progetto2.pdf">URBAN AND REGIONAL DEVELOPMEN - Cluster Tecnologie per le Smart Communities - Progetto Edifici a Zero Consumo Energetico in Distretti Urbani Intelligenti</a></li> 
--> 

Я почти уверен, что они будут копировать это и вставить его из комментария внутри веб-страницы.

ответ

1

Альтернативный (и я думаю, более надежный) подход будет использовать специализированный инструмент для работы - HTML Parser. Пример, используя BeautifulSoup, что выводит все comments содержащий URBAN слово:

import requests 
from bs4 import BeautifulSoup, Comment 

url = "http://dottorato.polito.it/Esami_accesso.html" 
response = requests.get(url) 

soup = BeautifulSoup(response.content) 
print soup.find_all(text=lambda text:isinstance(text, Comment) and 'URBAN' in text) 
+0

Это большой шаг вперед. Как насчет обработки ошибок? Это общий. Я не знал, как поймать все исключения запросов. 'request.exceptions.RequestException' было недостаточно. –

+0

@TharekM хорошо, 'RequestException' является базовым исключением для всех исключений, которые' request' имеет. Что было, когда этого было недостаточно? Благодарю. – alecxe

+0

Я нашел [это] (https://github.com/kennethreitz/requests/issues/1236). Он говорит: «socket.timeout выбрасывается вместо request.exceptions.Timeout». Я попытался добавить 'except socket.timeout', но это неправильный способ справиться с этим исключением. Спасибо. –