java调用python脚本无法正确获取返回值

fineTu 2015-01-13 06:00:40
一个简单的抓取rss的程序,需要用java调用,
python代码如下:

# coding: UTF-8

import hashlib
import simplejson as json
import time

import MySQLdb
import sys
import getopt
import feedparser

# reload(sys)
# sys.setdefaultencoding("utf-8")
class RssSingleCrawler:

def transJson(self,rss):
str = '{'
str += '\"title\":\"'+rss.feed.title.replace('\"','\\\"')+'\",\"link\":\"'+rss.feed.link.replace('\"','\\\"')+'\",\"subtitle\":\"\",'
str += '\"items\":['
for i in rss.entries:
str += '{\"text\":\"'+i['title'].replace('\"','\\\"')+'\",\"href\":\"'+i['link'].replace('\"','\\\"')+'\"},'
str = str[0:-1]
str += ']}'
return str

def crawlRssByTargetId(self, target_id):
flag = 0
try:
self.conn = MySQLdb.connect(host="localhost", user="webmoudel", passwd="newsMetro01", db="newsmetro", port=3306, charset="utf8")
cur = self.conn.cursor()
cur.execute('select * from target_point where id = %s and isRss=true;', target_id)

t = cur.fetchone()
rss = feedparser.parse(t[3])
rss_json = self.transJson(rss)

cur1 = self.conn.cursor()
cur1.execute('select count(*) from target_mapping where target_id = %s', t[0])
count = cur1.fetchone()
cur1.close()
if count > 0:
self.conn.cursor().execute('update target_mapping set items=%s,update_time=%s where target_id=%s', (rss_json,time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), t[0]))
else:
data_val = (t[0], rss_json, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
self.conn.cursor().execute('insert into target_mapping(target_id,items,update_time) values(%s,%s,%s)', data_val)
cur.close()
self.conn.commit()
except MySQLdb.Error, e1:
flag = 1
sys.stderr.write("Mysql Error %d: %s" % (e1.args[0], e1.args[1]))
except Exception:
flag = 2
return flag;

def crawlRssByUrl(self, url):
flag = 0
try:
rss = feedparser.parse(url)
rss_json = self.transJson(rss)
except Exception:
flag = 2
if flag==0 :
return rss_json
else:
return flag


shortargs = ''
longargs = ['target_id=', 'url=']
opts, args = getopt.getopt( sys.argv[1:], shortargs, longargs)

target_id = None
url = None
for t in opts:
if t[0]=="--target_id":
target_id = t[1]
if t[0]=="--url":
url = t[1]

crawler = RssSingleCrawler()
if target_id is not None:
crawler.crawlRssByTargetId(target_id)
elif url is not None:
sys.stdout.write(crawler.crawlRssByUrl(url))


java代码如下:
@Test
public void runtimeScriptTest(){
try {
Process process = Runtime.getRuntime().exec("python /home/finetu/projects/target_crawler/rss_single_crawler.py --url=http://jandan.net/feed");
InputStreamReader ir = new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
while((line = input.readLine()) != null)
System.out.println(line);
input.close();
ir.close();
} catch (IOException e) {
e.printStackTrace();
}
}


问题是:调试时打印出了hello world 但是没有打印出抓取到的rss内容,手动在控制台调用完全没问题,推测是编码有问题,又不知道该怎么弄。求大神帮助!
...全文
1542 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
PerryBaymax 2018-08-27
  • 打赏
  • 举报
回复
感谢楼主 我也是 从python获取返回值时各种为null = = 原来加上reload(sys) sys.setdefaultencoding("utf-8") 就好了 不知道是为什么 反正现在可以了 帮大忙了
fineTu 2015-01-15
  • 打赏
  • 举报
回复
自己解决了。 在python脚本前加上两句: reload(sys) sys.setdefaultencoding("utf-8") 顺便吐槽python的字符集设置简直反人类!

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧