2010-11-24 4 views
0

현재 정보를 사전에 넣으려는 웹 사이트를 스크리닝하려고합니다. 나는 urllib2와 BeautifulSoup을 사용하고 있습니다. 웹 페이지 소스 정보를 구문 분석하여 원하는 내용을 얻고 사전에 읽어들이는 방법을 알아낼 수 없습니다. 원하는 정보가 소스 코드에 <title>Nov 24 | 8:00AM | Sole In. Peace Out. </title>으로 표시됩니다. reg 표현식을 사용하여 줄을 읽고 시간과 날짜를 datetime으로 변환 한 다음 줄을 구문 분석하여 사전에 데이터를 읽으려고합니다.파이썬에서 화면 긁기

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) 

텍스트의 벽에 죄송하고 시간 내 주셔서 감사합니다 도움 : 사전 출력은 현재 코드

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

의 라인을 따라 뭔가를해야합니다!

+0

"wall of text"? 내 대답은 더 "wally";-) –

+0

기계화 모듈을 보았습니까? – robert

답변

0

EDIT : HTML 페이지가 아니라는 것을 깨닫지 못했기 때문에 Chris의 수정을 살펴보십시오. 아래는 HTML 페이지에서 작동합니다.

당신은 사용할 수 있습니다

titleTag = soup.html.head.title 

나 :

soup.findAll('title') 

여기를보세요 :이 같은

+0

HTML이 아닙니다. 그것은 RSS입니다. 따라서'soup.html.head.title'은 작동하지 않으며'soup.findAll ('title')은 차선책입니다. 그가 준 페이지를 보셨습니까? –

+0

감사 크리스, 참고 편집! –

1

뭔가 ..

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() 검색 요소의 모든 인스턴스를 반환하므로 다른 목록처럼 처리 할 수 ​​있습니다.

막 그것을해야한다고 :)

편집 : 그 또한 하루의 시간을 포함 있다고

+0

첫 번째 'title'요소는 실제로 건너 뛰고 싶은 요소이므로 어떻게 수행할까요? – amazinghorse24

+0

내 답변을 업데이트하겠습니다. – dpn

0
>>> 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.'} 

참고 아래 댓글에서 수정 :

Edit2가 작은 수정. 다음

그리고, 난 당신이 모든 항목을 원한다고 생각으로,

>>> 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.