This repository has been archived by the owner on Oct 18, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
article.py
78 lines (74 loc) · 2.52 KB
/
article.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import urllib.request
import patch_urllib_request
import urllib.parse
import html
import re
## NYTimes 기사
class Article:
## 주소
# @var string
url = str
## 제목
# @var string
title = str
## 단어 수
# @var int
words = int
## 타자 연습에 사용하기 좋게 60자로 자른 기사 본문
#
# 60자로 자르면 Practice 창에 보기 좋게 나온다.
# @see load()
# @var list<string>
texts = list
## 생성자
def __init__(self, url=None, title=None, words=None):
self.url = url
self.title = title
self.words = words
self.texts = []
## url에서 기사 본문을 긁어 온다.
def load(self, cnt=0):
if len(self.texts) > 0:
return
# 기사 본문 내려받기
url = 'http://mobile' + self.url[10:-4] + 'amp.html'
print('load', url)
response = urllib.request.urlopen(url)
content = response.read().decode('UTF-8')
# 문단 추출
startIdx = 0
paraRe = re.compile(r'body-text\'>(.*?)</p', re.S)
paragraphs = []
while 1:
match = paraRe.search(content, startIdx)
if match == None:
break
# HTML 태그 제거
raw = re.sub(r'<(?P<tag>[A-Za-z]).*?>(.*?)</(?P=tag).*?>', r'\2', match.group(1), flags=re.S).strip()
# quote 치환
raw = re.sub(r'[“”]|‘‘|’’', '"', raw)
raw = re.sub(r'[‘’]', "'", raw)
raw = re.sub(r'—', '-', raw)
raw = html.unescape(raw)
paragraphs.append(raw)
# 다음 문단 검색
startIdx = match.end() + 1
# 문장 자르기
for para in paragraphs:
startIdx = 0
while startIdx < len(para):
part = para[startIdx:startIdx + 60]
try:
# 문장이 덜 끝났다면 마지막 단어를 다음 문장으로 넘긴다.
if para[startIdx + 60] != ' ':
data = part.rsplit(' ', 1)
part = data[0]
# 문장에 단어가 하나밖에 없으면 자른다.
# 단어가 60자를 넘는 경우
if len(data) == 1:
part = part[:60 - 1] + '-'
startIdx -= 1
except:
pass
self.texts.append(part.strip())
startIdx += len(part)