关于Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
同类产品横向对比,从上图咋一看感觉 Jsoup 比名声大噪的 bs 还厉害的样子。
行吧先来试用一下看起来灰常全面的 Jsoup 。
String html = "<html><head><title>First parse</title></head><body><p>Parsed HTML into a doc.</p></body></html>";
Document document = Jsoup.parse(html);
Element body = document.body();
System.out.println(body.toString());
这是官网上面的第一个 jsoup 程序,我们看一下输出:
<body>
<p>Parsed HTML into a doc.</p>
</body>
最近公司有这样一个需求,就是要从新闻网站上抓取文章,并将其头部、尾部、评论、以及和文章不相关的元素弄掉。 比如左图:http://xw.qq.com/news/20170523062658/NEW2017052306265802
目标是达到右图效果(包括下面的评论区,相关推荐文章和一些广告都得处理掉)
思路是这样的用 jsoup 将网页弄下来,然后在网页尾部追加 js 代码将处理目标隐藏掉,当然对于异步加载的目标,则需要延迟隐藏掉。
关键Jquery代码(这里需要注意,如果源网页上没有 jquery 的引用,我们需要手动引用)
<!--script begin-->
<script>
function test() {
$('#ay-quiz-btn').removeAttr('data-boss');
$('#ay-quiz-btn').hide();
}
$(function() { $('.header').hide();
$('#ay-quiz-btn').removeAttr('data-boss');
$('#ay-quiz-btn').hide();
$('.ay-quiz').hide();
$('.comments').hide();
$('.related').hide();
$('.today_hot').hide();
$('.info-box').hide();
$('.footnav').hide();
$('.footer').hide();
$('.share').hide();
setInterval(function() {
test();
}, 1000);
})
</script>
<!--script begin-->
joup依赖:
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
看一下 java 实现代码:
public static void main(String[] args) throws Throwable{
// String html = "<html><head><title>First parse</title></head><body><p>Parsed HTML into a doc.</p></body></html>";
// Document document = Jsoup.parse(html);
// Element body = document.body();
// System.out.println(body.toString());
//目标url
String url = "http://xw.qq.com/news/20170523062658/NEW2017052306265802";
//Jsoup.connect(url).get() 请求改地址获取到一个document对象
Document doc = Jsoup.connect(url).get();
//System.out.println(doc);
//需要追加的 script 段 ,如果源网页中没有 jquery 引入 则需要手动引入 这一段 script 仅仅对于腾讯新闻网这个站点有用
String script = "<!--script begin-->" +
"<script>" +
"function test(){" +
"$('#ay-quiz-btn').removeAttr('data-boss');"+
"$('#ay-quiz-btn').hide();"+
"}"+
"$(function(){"+
"$('.header').hide();"+
"$('#ay-quiz-btn').removeAttr('data-boss');"+
"$('#ay-quiz-btn').hide();"+
"$('.ay-quiz').hide();"+
"$('.comments').hide();"+
"$('.related').hide();"+
"$('.today_hot').hide();"+
"$('.info-box').hide();"+
"$('.footnav').hide();"+
"$('.footer').hide();"+
"$('.share').hide();"+
"setInterval(function () {"+
"test();"+
"}, 1000);"+
"})"+
"</script>"+
"<!--script begin-->";
//在得到的 document 对象的尾部追加这段script
doc.append(script);
//输出处理后的 html ,这里可以做文件输出处理,输出html 供外部访问
System.out.println(doc);
}