KLDP 최근글을 텍스트로 변환해서 셀빅에서 읽기

Rica의 이미지

예전부터 Cellvic-i를 써 오고 있습니다. 텍스트 읽기 전용으로요. 따라서 항상 갖고 다니는 것은 아니고, '뭔가 읽을 것이 있을 때'만 들고 다닙니다. 특히 이영도님의 연재가 있는 기간에는 셀빅이 빛을 발하지요. (...)

요즘은 잘 안 들고 다니는데, 학교에서 집까지 걸어다니는 길이 심심하기도 해서 다시 꺼내봤습니다. 그런데 별로 셀빅에 넣어서 읽을 만한 텍스트가 없어서 난감해 하고 있는 도중에, KLDP BBS에 올라오는 글을 텍스트로 변환해서 읽으면 좋지 않을까 하는 생각이 떠올라서 오후를 투자해서 만들어 봤습니다.

CYGWIN에서 만들었고, 보통의 리눅스에선 그럭저럭 잘 돌 거라고 생각되네요.
파이썬이 깔려 있어야 합니다.

print_recent_article_number:

#!/bin/bash

wget -Otemp_rss.xml -q  http://bbs.kldp.org/rss.php
grep "viewtopic.php?p=" temp_rss.xml  | head -n1 | sed -n 's/.*=//p' | sed -n 's/#.*//p'
rm temp_rss.xml

쉘스크립트입니다. KLDP BBS에서 RSS 피드를 받아온 뒤, 그로부터 '가장 최신 글번호' 를 알아내어 stdout으로 찍어주는 기능을 합니다.

html2text.py:
http://www.aaronsw.com/2002/html2text/ 에서 받으시고,

--- html2text.py	2005-10-25 17:09:35.000000000 +0900
+++ ../html2text.py	2005-10-25 17:05:13.000000000 +0900
@@ -77,7 +77,10 @@
 
 r_unescape = re.compile(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));")
 def unescape(s):
-	return r_unescape.sub(replaceEntities, s)
+	try:
+		return r_unescape.sub(replaceEntities, s)
+	except:
+		return None
 	
 def fixattrs(attrs):
 	# Fix bug in sgmllib.py
@@ -185,16 +188,18 @@
  		for a in self.a:
  			i += 1
  			match = 0
- 			
- 			if a.has_key('href') and a['href'] == attrs['href']:
- 				if a.has_key('title') or attrs.has_key('title'):
- 						if (a.has_key('title') and attrs.has_key('title') and
-						    a['title'] == attrs['title']):
- 							match = True
- 				else:
- 					match = True
-
- 			if match: return i
+ 			try:
+	 			if a.has_key('href') and a['href'] == attrs['href']:
+ 					if a.has_key('title') or attrs.has_key('title'):
+ 							if (a.has_key('title') and attrs.has_key('title') and
+							    a['title'] == attrs['title']):
+	 							match = True
+ 					else:
+ 						match = True
+
+	 			if match: return i
+			except:
+				return None
 
 	def handle_tag(self, tag, attrs, start):
 		attrs = fixattrs(attrs)
@@ -365,7 +370,11 @@
 				self.a = newa
 
 			self.p_p = 0
-			self.out(data)
+			try:
+				self.out(data)
+			except:
+				pass
+				
 			self.lastWasNL = data and data[-1] == '\n'
 			self.outcount += 1
 

이렇게 패치해 주시면 됩니다. 인코딩 관련해서 익셉션이 새는 버그가 좀 있는데, 파이썬을 전혀 모르는지라-_-그냥 구멍만 틀어막았습니다 ;

gather:

#!/bin/bash

start=`cat last_recent_article_number`
limit=`./print_recent_article_number`;
echo $limit;

for(( i=$start; i<=$limit; i=i+1 ))
do
	echo $i / $limit;

	wget -q -Oraw.html  http://bbs.kldp.org/viewtopic.php?p=$i
	python html2text.py < raw.html | sed 's/^\[.*\]$//' | sed '/^[ \t]*$/d' | sed '/   \[[0-9]*\].*/d' | sed 's/\!.*//' > out.txt
	rm -f raw.html

	cat out.txt | head -n 3 | tail -n 1 | sed 's/\?//' |
		sed 's/[\\\/\:\*\?\"\<\>\|]//g' |
		sed 's/^/mv out.txt "/' |
		sed 's/[ ]*$/.txt"/' > rename.sh
	
	./rename.sh
	rm -f rename.sh
done

./print_recent_article_number > last_recent_article_number

exit 0

./gather 로 실행시키면 last_recent_article_number부터 최근글까지 KLDP에 올라온 글을 모두 받아서 텍스트로 읽기 편한 형태로 변환한 후, 글의 제목을 파일 이름으로 하여 저장합니다. 한 스레드 안에 있는 모든 글이 똑같은 이름으로 저장되기 때문에 불필요한 중복 처리가 발생하고, 두 페이지 이상 넘어간 스레드는 제대로 처리하지 못한다는 문제점이 있습니다.

sed도 파이썬도 쉘도 잘 몰라서, 괴상한 코드가 쏟아져나왔네요. :oops:

부끄러워서 안 올리려다가- KLDP에 올리면 좋은 코멘트를 받을 수 있을 거라는 stania군의 압박에 슬쩍. =3==3

ed.netdiver의 이미지

관리자분들께서 지나치셨을지도 몰라, 위로 올릴겸, 소스코드공유방으로 옮길것을 추천합니당^^;

저도 셀빅만 한 3년정도 썼던 적이 있었답니다.
근데 지금은 우리 애들 장난감^^;
적당한 용도를 못찾겠던데, 이런 좋은 방법이 있었군요. :D

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)