关于怎么获取豆瓣日志的文章 原来有写过一篇:http://fair-jm.iteye.com/blog/1896575
这个是用htmlparser的 现在的改成jsoup 原理差不多 都是根据tag 还有id来获取 日志的标题 发布时间和内容的
先来一张效果图吧 生成的还不错(生成的来源依旧是我姐的豆瓣日志:http://www.douban.com/people/maybedekky/notes) 没错这个工具图片的地址是直接转成图片的...不是text文本..略强大
所以这部分就略过了 需要的可以看上面的日志。
itextpdf的下载地址是:
http://itextpdf.com/download.php
为了格式 还需要一个iText XML Worker来直接将html的内容转成pdf(一些css的设置最好全清空了 不然格式会乱七八糟了)
这里有个中文支持的问题
看这里:http://blog.csdn.net/kings988/article/details/5393982
不过我自己试了下不用这么麻烦 只要把字体改成支持中文的字体就好了 很简单的一段(因为支持中文的字体也一定支持英文的不是吗?)
在com.itextpdf.tool.xml.css.apply下的ChunkCssApplier类中这样修改:(这两个类都是在IText Xml worker的jar下的):
好这样中文问题就解决啦(你想换什么字体就换好了)
生成的主要代码只有一行:
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new StringReader("<html><body>"+arti.warpInfo()+"</body></html>"));
三个参数分别是:
com.itextpdf.tool.xml.XMLWorkerHelper com.itextpdf.text.Document java.io.Reader
当然还有其他重载的方式
example代码如下 这段代码做测试用的 生成的文件也是完好的:
package org.cc.abao.test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.cc.abao.vo.Article;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
/**
*
* @author cc fair_jm(http://fair-jm.iteye.com/)
*
*/
public class TestJsoup {
public static void main(String[] args) throws MalformedURLException,
IOException, DocumentException {
Document doc = Jsoup.parse(new URL(
"http://www.douban.com/people/maybedekky/notes"), 5000);
Elements elements = doc.select("a[data-url]");
List<String> urls = new ArrayList<String>();
for (Element element : elements) {
urls.add(element.attr("data-url"));
}
System.out.println(urls);
StringBuffer snote=new StringBuffer();
Article arti=new Article();
// for(String url:urls){
Document article = Jsoup.parse(new URL(urls.get(0)), 5000);
Elements notes = article.select("div#link-report");
Element note = notes.get(0);
arti.setContent(note.html());
arti.setTitle(article.select("title").get(0).text());
arti.setDate(article.select("span[class=pl]").get(0).text());
// snote="<html><body>"+note.html().replaceAll("<div.*>", "")
// .replaceAll("</div>", "")+"</body></html>";
// snote.append(note.html().replaceAll("<div.*>", "").replaceAll("</div>", ""));
// }
com.itextpdf.text.Document document=new com.itextpdf.text.Document();
String name=TestJsoup.class.getResource("/").getFile().substring(1)+"/results/loremipsum.pdf";
Files.deleteIfExists(Paths.get(name));
Files.createFile(Paths.get(name));
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream(name));
writer.setViewerPreferences(PdfWriter.HideToolbar);
document.open();
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new StringReader("<html><body>"+arti.warpInfo()+"</body></html>"));
// System.out.println(snote);
document.close();
}
}
代码已经是乱七八糟的了....
还有个Article的vo类:
package org.cc.abao.vo;
public class Article {
private String title;
private String date;
private String content;
private String wrappedInfo;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String warpInfo(){
if(wrappedInfo==null){
wrappedInfo="<p><span style=\"font-size: xx-large;\">"+title+"</span></p><p>"+date+"</p><br /><hr /><h2>"+
content.replaceAll("<div.*>", "").replaceAll("</div>", "")+"</h2><br /><hr />";
}
return wrappedInfo;
}
}
具体的代码就不放了 说下流程:
- 从日志的首页获取全部的日志页(从全部的http://www.douban.com/people/maybedekky/notes?start=XX中得到 形式 1到13页的话 也就是 start=0 start=10.....start=120)
- 获取日志内容(同时生成Article 放在list中并排序)
- 生成日志
这三个分别对应三个工具类:
具体代码就不发了 不是很难 大家有兴趣自己动手下吧