Соскребание экрана в Python - PullRequest
0 голосов
/ 24 ноября 2010

В настоящее время я пытаюсь отсканировать сайт, чтобы поместить информацию в словарь.Я использую urllib2 и BeautifulSoup.Я не могу понять, как проанализировать исходную информацию веб-страниц, чтобы получить то, что я хочу, и прочитать ее в словарь.Информация, которую я хочу, отображается как <title>Nov 24 | 8:00AM | Sole In. Peace Out. </title> в исходном коде.Я думаю об использовании выражения reg для чтения в строке, преобразования времени и даты в дату и время, а затем разбора строки для чтения данных в словарь.Вывод словаря должен быть примерно таким:

[ { "date": dateime(2010, 11, 24, 23, 59), "title": "Sole In. Peace Out.", } ]

Текущий код:

from BeautifulSoup import BeautifulSoup
import re
import urllib2
url = 'http://events.cmich.edu/RssStudentEvents.aspx'
response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)

Извините за стену текста, и спасибо за ваше времяи помогите!

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

Примерно так ..

titletext = soup.findAll('title')[1].string #assuming it's the second title element.. I've seen worse in html
import datetime
datetext = titletext.split("|")[0]
title = titletext.split("|")[2]
date = datetime.datetime.strptime(datetext,"%b %d").replace(year=2010)
the_final_dict = {'date':date,'title':title}

findAll() возвращает все экземпляры элемента поиска ... так что вы можете просто обработать его как любой другой список.

Это должно примерносделай это:)

Правка: мелкое исправление

Правка2: исправление из комментариев ниже

0 голосов
/ 24 ноября 2010
>>> soup.findAll('item')[1].title
<title>Nov 24 | 8:00AM | Sole In. Peace Out. </title>
>>> soup.findAll('item')[1].title.text
u'Nov 24 | 8:00AM | Sole In. Peace Out.'
>>> date, _, title = soup.findAll('item')[1].title.text.rpartition(' | ')
>>> date
u'Nov 24 | 8:00AM'
>>> title
u'Sole In. Peace Out.'
>>> from datetime import datetime
>>> date = datetime.strptime(date, "%b %d | %I:%M%p").replace(year=datetime.now().year)
>>> dict(date=date, title=title)
{'date': datetime.datetime(2010, 11, 24, 8, 0), 'title': u'Sole In. Peace Out.'}

Обратите внимание, что это также включает время суток.

А потом, как я думаю, вам нужны все элементы,

>>> from datetime import datetime
>>> matches = []
>>> for item in soup.findAll('item'):
...     date, _, title = item.title.text.rpartition(' | ')
...     matches.append(dict(date=datetime.strptime(date, '%b %d | %I:%M%p').replace(year=datetime.now().year), title=title))
... 
>>> from pprint import pprint
>>> pprint(matches)
[{'date': datetime.datetime(2010, 11, 24, 8, 0),
  'title': u'The Americana Indian\u2014American Indian in the American Imagination'},
 {'date': datetime.datetime(2010, 11, 24, 8, 0),
  'title': u'Sole In. Peace Out.'},
...
 {'date': datetime.datetime(2010, 12, 8, 8, 0),
  'title': u'Apply to be an FYE Mentor'}]

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

Последнее добавление: генератором был бы хороший способ использовать это.

from datetime import datetime
import urllib2
from BeautifulSoup import BeautifulSoup

def whatevers():
    soup = BeautifulSoup(urllib2.urlopen('http://events.cmich.edu/RssStudentEvents.aspx').read())
    for item in soup.findAll('item'):
        date, _, title = item.title.text.rpartition(' | ')
        yield dict(date=datetime.strptime(date, '%b %d | %I:%M%p').replace(year=datetime.now().year), title=title)

for match in whatevers():
    pass  # Use match['date'], match['title'].  a namedtuple might also be neat here.
0 голосов
/ 24 ноября 2010

РЕДАКТИРОВАТЬ: я не понял, что это не HTML-страница, так что взгляните на исправление Криса. Ниже будет работать для HTML-страниц.

Вы можете использовать:

titleTag = soup.html.head.title

или

soup.findAll('title')

Взгляните сюда:

...